@IBAction func methodName(_ sender: UIButton) { }
我不明白在那里有什么目的.任何人都可以解释它为什么存在吗?在之前的Swift 2.2中它并不存在.
另一个问题是,我通过观看教程完成的先前项目已迁移到Swift 3,并且有一种方法看起来像这样:
func toggleButtons(toggle: Bool) { yesButton.isUserInteractionEnabled = toggle noButton.isUserInteractionEnabled = toggle }
我这样调用这个方法:toggleButtons(false)仍然没有传递参数名称.现在,迁移器已经如下所示进行了更改,但是稍后在代码中调用方法时没有任何更改.
func toggleButtons(_ toggle: Bool) { yesButton.isUserInteractionEnabled = toggle noButton.isUserInteractionEnabled = toggle }
这是与前一案件不同的情况吗?
解决方法
但是,您的问题具体是“将操作附加到ViewController”.
具有@IBAction属性的方法可以连接到storyboard(或xib)中的控件.这意味着该方法的名称将作为字符串存储在故事板中,并将使用Objective-C消息发送系统进行调用.因此,确切的名称以及名称如何转换为Objective-C在这里非常重要.
如果声明方法func methodName(sender:UIButton),那么它的Objective-C名称是methodNameWithSender:.
如果声明方法func methodName(_ sender:UIButton),则其Objective-C名称为methodName:.
iOS和macOS都有称为“响应者链”的东西,它允许系统搜索可以处理动作的对象(“响应者”).您可以将故事板中的控件连接到First Responder(位于文档大纲的顶部),以使系统执行此操作.最常见的是,您使用macOS中的菜单项执行此操作,但还有其他用途.
无论如何,有一些标准的动作,如cut:,copy:和paste:.例如,您可以将“剪切”菜单项的操作设置为“将剪切:发送到第一响应者”.如果你想在你的视图控制器中实现cut:方法,那么关键是它的名字(当翻译成Objective-C时)被精确剪切:而不是cutWithSender:.如果它被命名为cut:,系统将在搜索响应者链时找到它,但如果它被命名为cutWithSender:,系统将找不到它,你会想知道为什么你的菜单项不起作用.
Xcode知道这一点,所以它总是创建@IBAction func动作形式的动作方法(_ sender:UIButton),省略参数中的关键字,以防你实现需要通过搜索响应者链找到的动作.
在Swift 3中,方法的每个参数默认都有一个关键字,包括第一个参数.回到Swift 2,第一个参数默认没有关键字,所以第一个参数的_在Swift 2中是多余的(并且会生成编译器警告).这就是为什么Xcode 8(Swift 3)输入_但Xcode 7(Swift 2.2)没有.
这也是你的toggleButtons示例在Xcode 7中工作的原因.