Objective-Cselect器不推荐使用replace
正如许多问题最近所显示的那样,字面select器已被弃用。 有一个快速的解决scheme,如果select器只在一个类中就可以正常工作。
但是考虑一下这个例子(我有更多的代码,这是一个简单的例子):
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 }
这个实用方法给了我很好的function,可以在各种视图控制器中使用。 由于它的多重用法,我必须将其复制到每个视图控制器以使用新的#selector
语法。 但苹果,为什么贬低更dynamic的方法? 我想在新版本中,他们会删除它,像i++
, i++
和C风格for
循环(但是它们可以很容易地被replace,但我不明白为什么它们会被删除)。 是否有任何解决方法来保持这种方法在未来的版本中工作? 每个新版本都打破了我所有的项目语法。
为什么弃用更多的dynamic方法?
从build议做出这个改变 :
我们免费开发人员必须手动进行命名翻译,并静态检查该方法是否存在,并暴露给Objective-C。
对于你的方法,你可以制定一个协议,指出某种方法是存在的:
@objc protocol MenuButtonClickable { func menuButtonClicked() }
在你的视图控制器中,添加这个方法:
extension MyViewController : MenuButtonClickable { func menuButtonClicked() { // do something } }
然后更新你的方法签名来使用这个协议:
static func createMenuButton(controller:MenuButtonClickable) -> UIBarButtonItem {
现在Swift编译器保证了controller
有这个方法,所以你可以使用新的#selector
语法。
如果你不小心尝试在没有这个函数的视图控制器上使用这个方法,你会得到一个编译时错误,而不是运行时错误。