Swift无法识别的选择器发送到实例分段控件

Evg*_*ban 3 ios swift

我试图将选择器添加到我的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

Kru*_*nal 5

替换你的动作参数 - 选择器.从Swift 3开始,选择器语法已经改变.

segmentedControl.addTarget(self, action: #selector(self.changeColor(sender:)), for:.valueChanged)
Run Code Online (Sandbox Code Playgroud)


Pun*_*rma 5

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)