Objective-C选择器已弃用替换

时间:2016-03-23 17:15:58

标签: ios swift

最近有很多问题,文字选择器已被弃用。这是一个快速修复,如果选择器只在那一个类中,它可以正常工作。

但请考虑这个例子(我有更多的代码;这是一个简化的例子):

static func createMenuButton(controller:UIViewController) -> UIBarButtonItem {
    let menuButton = UIButton(frame: CGRectMake(0, 0, 22, 22))
    menuButton.addTarget(controller, action: Selector("menuButtonClicked:"), forControlEvents:.TouchUpInside)
    let menuButtonContainer = UIView(frame: menuButton.frame)
    menuButtonContainer.addSubview(menuButton)
    let menuButtonItem = UIBarButtonItem(customView: menuButtonContainer)
    return menuButtonItem
}

此实用程序方法为我提供了在各种视图控制器中使用的良好功能。由于其多次使用,我必须将其复制到每个视图控制器以使用新的#selector语法。但是Apple为什么要弃用更多动态方法呢?我想在新版本中他们会删除它,例如i++i--和C风格的for循环(但它们可以轻松替换,但我不会删除它们。为什么他们删除它们)。是否有任何变通方法可以使这种方法在未来的版本中运行?每个新版本都会破坏我的所有项目语法。

1 个答案:

答案 0 :(得分:2)

  

为什么弃用更多动态方法?

来自the proposal to make this change

  

我们让开发人员不必手动执行命名转换,并静态检查该方法是否存在并暴露给Objective-C。

对于您的方法,您可以制定一个指示某种方法存在的协议:

@objc protocol MenuButtonClickable {
    func menuButtonClicked()
}

在视图控制器中,添加以下方法:

extension MyViewController : MenuButtonClickable {
    func menuButtonClicked() {
        // do something
    }
}

然后更新您的方法签名以使用此协议:

static func createMenuButton(controller:MenuButtonClickable) -> UIBarButtonItem {

现在,Swift编译器保证controller具有该方法,因此您可以使用新的#selector语法。

如果您不小心尝试在没有此功能的视图控制器上使用此方法,您将收到编译时错误而不是运行时错误。