从NSNotification事件调用协议方法的默认实现

时间:2015-11-03 19:19:45

标签: ios swift nsnotificationcenter

我有一个旨在由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()方法的解决方法,我希望能够让视图控制器只是注册通知并将工作卸载到协议上扩展

1 个答案:

答案 0 :(得分:1)

您不能按照您尝试的方式执行此操作。请记住,Objective-C只知道Objective-C语言的特性。它对Swift枚举,结构,泛型,元组等一无所知;这样的Swift功能对于Objective-C是完全不可见的。以同样的方式,Objective-C对Swift协议一无所知,特别是Swift协议扩展。就Objective-C而言,视图控制器类中不存在viewDidRotate方法。因此崩溃。