我试图将选择器添加到我的UISegmentedControl.
segmentedControl = UISegmentedControl(items: items)
segmentedControl.layer.cornerRadius = 12.0
segmentedControl.layer.borderColor = UIColor.purpleLight.cgColor
segmentedControl.layer.borderWidth = 1.0
segmentedControl.layer.masksToBounds = true
segmentedControl.backgroundColor = .white
self.contentView.addSubview(segmentedControl)
segmentedControl.addTarget(self, action: Selector(("changeColor:")), for:.valueChanged)
Run Code Online (Sandbox Code Playgroud)
然后:
func changeColor(sender: UISegmentedControl) {
switch sender.selectedSegmentIndex {
case 1:
segmentedControl.backgroundColor = UIColor.green
case 2:
segmentedControl.backgroundColor = UIColor.blue
default:
segmentedControl.backgroundColor = UIColor.purple
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我点击它时,我收到了一个错误 - unrecognized selector sent to instance 0x7fcf5f049000
替换你的动作参数 - 选择器.从Swift 3开始,选择器语法已经改变.
segmentedControl.addTarget(self, action: #selector(self.changeColor(sender:)), for:.valueChanged)
Run Code Online (Sandbox Code Playgroud)
Krunal的答案是正确的并且会修复你的错误,但要理解为什么这样做,你可以读到这个:
对字符串文字使用选择器名称非常容易出错:没有检查字符串是否是一个格式良好的选择器,更不用说它引用任何已知方法,或者是指目标类的方法.此外,通过努力执行Objective-C API的自动重命名,Swift名称和Objective-C选择器之间的链接是不明显的.通过提供基于方法的Swift名称的显式"创建选择器"语法,我们消除了开发人员对使用的实际Objective-C选择器进行推理的需要.
虽然,如果您想使用Selector语法,并且可能存在您希望通过动态字符串名称调用方法的情况,您仍然可以使用Selector语法.对于类中的方法,即NSObject的子类,可以直接使用Selector和字符串文字来调用方法.唯一的条件是您需要在Selector中传递Objective-C方法语法.
在你的情况下,这将工作:
segmentedControl.addTarget(self, action: Selector(("changeColorWithSender:")), for:.valueChanged)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
826 次 |
| 最近记录: |