【发布时间】:2016-11-27 01:06:09
【问题描述】:
我有一个名为 FooFramework 的 Cocoa Touch 框架。
在其中,我想在键盘显示时管理选定视图在 Y 轴上的向上移动。我创建了一个KeyboardManager 类。下面是它的外观:
import UIKit
public class KeyboardManager {
var notifyFromObject: Any?
var observer: Any
public var viewsToPushUp: [UIView] = []
public init(observer: Any, viewsToPushUp: [UIView], notifyFromObject: Any? = nil) {
self.observer = observer
self.notifyFromObject = notifyFromObject
self.viewsToPushUp = viewsToPushUp
}
public func pushViewsUpWhenKeyboardWillShow(){
let notificationCenter = NotificationCenter.default
print(self)
notificationCenter.addObserver(self.observer, selector: #selector(FooFramework.KeyboardManager.pushViewsUp), name: NSNotification.Name.UIKeyboardWillShow, object: notifyFromObject)
}
@objc public func pushViewsUp(notification: NSNotification) {
if let keyboardRectValue = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
let keyboardHeight = keyboardRectValue.height
for view in viewsToPushUp {
view.frame.origin.y -= keyboardHeight
}
}
}
}
然后,我将这个 FooFramework 导入到一个名为 Bar 的 iOS 应用程序中。为了测试 FooFramework,我想推一个UITextField。代码如下:
import UIKit
import FooFramework
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let kb = KeyboardManager(observer: self, viewsToPushUp: [textField], notifyFromObject: nil)
kb.pushViewsUpWhenKeyboardWillShow()
}
func pushViewsUp(notification: NSNotification) {
print("This should not be printed")
}
}
我的问题是This should not be printed 出现在控制台中,而KeyboardManager 中的pushViewsUp 方法永远不会被调用。尽管我为选择器使用了完全限定的名称,但它坚持使用 ViewController 中的 pushViewsUp。这让我发疯了。
如果我从 ViewController 中删除 pushViewsUp,我会收到以下错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Bar.ViewController pushViewsUpWithNotification:]: unrecognized selector sent to instance 0x7fc540702d80'
我需要做什么才能使选择器正确指向FooFramework.KeyboardManager.pushViewsUp?
【问题讨论】:
标签: swift swift3 selector ios10