代码之家  ›  专栏  ›  技术社区  ›  Evgeniy Kleban

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

  •  3
  • Evgeniy Kleban  · 技术社区  · 9 年前

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

    然后:

    func changeColor(sender: UISegmentedControl) {
            switch sender.selectedSegmentIndex {
            case 1:
                segmentedControl.backgroundColor = UIColor.green
            case 2:
                segmentedControl.backgroundColor = UIColor.blue
            default:
                segmentedControl.backgroundColor = UIColor.purple
            }
        }
    

    然而,当我点击它时,我得到了一个错误- unrecognized selector sent to instance 0x7fcf5f049000

    2 回复  |  直到 9 年前
        1
  •  5
  •   Krunal    9 年前

    替换动作参数-选择器。自Swift 3以来,选择器语法已更改。

    segmentedControl.addTarget(self, action: #selector(self.changeColor(sender:)), for:.valueChanged)
    
        2
  •  5
  •   Puneet Sharma    9 年前

    this :

    容易出错:无法检查字符串是否为 预期类的方法。此外,在努力执行 Objective-C选择器不明显。通过提供明确的“创建” 基于方法的Swift名称的“选择器”语法,我们消除了 开发人员需要对实际的Objective-C进行推理

    尽管如此,如果您想使用选择器语法,并且在某些情况下可能需要通过动态字符串名称调用方法,您仍然可以使用选择器语法。对于类中的方法,即NSObject的子类,可以直接使用带字符串文字的选择器来调用方法。唯一的条件是您需要在选择器内传递Objective-C方法语法。

    segmentedControl.addTarget(self, action: Selector(("changeColorWithSender:")), for:.valueChanged)