我有一个旨在由UIViewController
使用的协议,它有两个默认的方法实现
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;
}
}
}
直接在视图控制器的代码中调用这些方法适用于这两种方法;调用registerForRotationNotifications()
注册视图控制器以获取设备旋转通知,并且调用viewDidRotate()
正确执行switch语句。但是,在致电registerForRotationNotifications()
并收到实际通知后,我收到了消息
2015-11-03 10:46:53.111 APP_NAME[57415:2484548] -[APP_NAME.ViewController viewDidRotate]: unrecognized selector sent to instance 0x7f8afb019a00
我认为这可能是因为视图控制器未提供对viewDidRotate()
方法的公共访问,但我无法在任何协议方法定义上使用public
关键字或默认实现。
有没有办法让通知中心正确调用协议扩展中的默认实现?我不想使用从视图控制器本身调用viewDidRotate()
方法的解决方法,我希望能够让视图控制器只是注册通知并将工作卸载到协议上扩展
答案 0 :(得分:1)
您不能按照您尝试的方式执行此操作。请记住,Objective-C只知道Objective-C语言的特性。它对Swift枚举,结构,泛型,元组等一无所知;这样的Swift功能对于Objective-C是完全不可见的。以同样的方式,Objective-C对Swift协议一无所知,特别是Swift协议扩展。就Objective-C而言,视图控制器类中不存在viewDidRotate
方法。因此崩溃。