gpt4 book ai didi

ios - 从 NSNotification 事件调用协议(protocol)方法的默认实现

转载 作者:行者123 更新时间:2023-11-29 01:30:37 24 4
gpt4 key购买 nike

我有一个供 UIViewController 使用的协议(protocol),它有两个默认的方法实现

protocol RotationMonitor {

func registerForRotationNotifications()

func viewDidRotate()
}

extension RotationMonitor where Self: UIViewController {
func registerForRotationNotifications() {
NSNotificationCenter.defaultCenter().addObserver(self, selector: "viewDidRotate", name: UIDeviceOrientationDidChangeNotification, object: nil)
}

func viewDidRotate() {
switch UIDevice.currentDevice().orientation {
case .LandscapeLeft, .LandscapeRight:
print("Device is landscape")
case .Portrait:
print("Device is portrait")
case .PortraitUpsideDown:
print("Device is portrait, upside down.")
default:
// ignore
break;
}
}
}

直接在 View Controller 的代码中调用这些方法对于这两种方法都适用;调用 registerForRotationNotifications() 注册设备旋转通知的 View Controller ,并调用 viewDidRotate() 正确执行 switch 语句。但是,在调用 registerForRotationNotifications() 并收到实际通知后,我收到一条崩溃消息

2015-11-03 10:46:53.111 APP_NAME[57415:2484548] -[APP_NAME.ViewController viewDidRotate]: unrecognized selector sent to instance 0x7f8afb019a00

我认为这可能是因为 View Controller 没有提供对 viewDidRotate() 方法的公共(public)访问,但我无法使用 public 关键字在任何协议(protocol)方法定义或默认实现上。

有没有办法让通知中心正确调用协议(protocol)扩展中的默认实现?我不想使用像从 View Controller 本身调用 viewDidRotate() 方法这样的解决方法,我希望能够让 View Controller 简单地注册通知并拥有工作转移到协议(protocol)扩展上。

最佳答案

你不能按照你想要的方式来做这件事。请记住,Objective-C 只知道 Objective-C 语言特性。它对 Swift 枚举、结构、泛型、元组等一无所知;这些 Swift 特性对于 Objective-C 是完全不可见的。同样,Objective-C 对 Swift 协议(protocol)一无所知,尤其是对 Swift 协议(protocol)扩展一无所知。就 Objective-C 而言,viewDidRotate 方法不存在于 View Controller 类中。因此崩溃。

关于ios - 从 NSNotification 事件调用协议(protocol)方法的默认实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33507303/

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