gpt4 book ai didi

ios - 通过协议(protocol)扩展将选择器与协议(protocol)方法的默认实现一起使用

转载 作者:可可西里 更新时间:2023-11-01 00:21:04 25 4
gpt4 key购买 nike

我正在尝试制定一个 ViewController 可以实现的协议(protocol)来调整其 View 以适应键盘显示/隐藏。

protocol KeyboardAdaptable {
func keyboardWillShow(notification: NSNotification)
func keyboardWillHide(notification: NSNotification)
func addKeyboardNotificationObservers()
}

extension KeyboardAdaptable where Self: UIViewController, Self: NSObject {
func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
if self.view.frame.origin.y == 0{
self.view.frame.origin.y -= keyboardSize.height
}
}
}

func keyboardWillHide(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
if self.view.frame.origin.y != 0{
self.view.frame.origin.y += keyboardSize.height
}
}
}

func addKeyboardNotificationObservers() {
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
}

错误:“#selector 的参数引用了未向 Objective-C 公开的实例方法‘keyboardWillShow’。”

我知道选择器是 Objective-C 的一个特性,引用的函数必须兼容。我试图通过标记协议(protocol)本身以及使用 @objc 注释的方法来解决这个问题,但是编译器坚持我也使用 @objc 标记协议(protocol)扩展中的默认实现。当我这样做时,它对我大喊大叫,要求我删除 @objc 注释,因为 “@objc 只能与类成员、@objc 协议(protocol)和类的具体扩展一起使用”(即不在协议(protocol)中扩展名?)

有谁知道实现这个目标的方法吗?我知道乍一看似乎没有办法解决它,但我也知道 UIViewController 是 NSObject 的子项,通常允许 UIViewController 上的实例方法成为选择器的目标。我想通过对我的协议(protocol)扩展施加约束,要求它是 UIViewController 的子类,我可以将其中包含的默认实现作为选择器的目标。

想法?

最佳答案

做不到。

每个人(包括我自己)一开始都认为这是一个很酷的想法,但事实并非如此。

Swift 协议(protocol)扩展对 Objective-C 是不可见的。对此无能为力。即使使用 #selector 也不起作用,因为:

您的协议(protocol)功能在协议(protocol)扩展中定义。

人们不断尝试通过协议(protocol)扩展将 Objective-C 可调用功能(选择器、委托(delegate)方法等)注入(inject)到类中。对不起。

关于ios - 通过协议(protocol)扩展将选择器与协议(protocol)方法的默认实现一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44010206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com