错误:点击 UISegmentedControl 时将无法识别的选择器发送到实例

Posted

技术标签:

【中文标题】错误:点击 UISegmentedControl 时将无法识别的选择器发送到实例【英文标题】:Error: Unrecognised selector sent to instance when tap on UISegmentedControl 【发布时间】:2020-01-02 02:03:03 【问题描述】:

点击其中一个片段触发操作时出现错误。

知道我做错了什么吗?

错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[TestingSubclassing.MySegmentControl segmentActionWithSender:]:无法识别的选择器发送到实例 0x7f9217907750'

import UIKit

class MySegmentControl: UISegmentedControl 

    var actionName:Selector
    init(actionName: Selector) 
        self.actionName = actionName

        super.init(frame: .zero)

        insertSegment(withTitle: "Two", at: 0, animated: false)
        insertSegment(withTitle: "One", at: 1, animated: false)

        self.selectedSegmentIndex = 0

        self.layer.cornerRadius = 5.0
        self.backgroundColor = UIColor.red
        self.layer.borderWidth = 1
        self.layer.borderColor = UIColor.blue.cgColor

        self.addTarget(self, action: self.actionName, for: .valueChanged)

        self.translatesAutoresizingMaskIntoConstraints = false
    

    required init?(coder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

在 ViewController 中的使用

import UIKit

class ViewController: UIViewController 

    let segmentOne: MySegmentControl = 
        let segment1 = MySegmentControl(actionName:  #selector(segmentAction))
        return segment1
    ()

    override func viewDidLoad() 
        super.viewDidLoad()
        view.addSubview(segmentOne)
    

    @objc func segmentAction(sender: UISegmentedControl) 
        print("segmentAction")
    

我也尝试过如下更改选择器。

let segment1 = MySegmentControl(actionName: #selector(segmentAction(sender:)))let segment1 = MySegmentControl(actionName: "segmentAction")

【问题讨论】:

问题是你已经将action target设置为self,这意味着选择器将在段控制器上被调用,而不是在视图控制器上。您可能会更好地使用委托模式或提供回调闭包 【参考方案1】:

你一定是新手! 你应该删除class MySegmentControl中的self.addTarget(self, action: self.actionName, for: .valueChanged),添加下面的函数viewDidLoad()

segmentOne.addTarget(self, action: #selector(segmentAction(sender:)), for: .valueChanged)

【讨论】:

我可以接受这个解决方案,但是,仅供参考 - 我最初试图将选择器作为参数传递,以最小化 ViewController 中的代码量,并可能创建一个 UISegmentedControl 与一行代码,例如let segment1 = MySegmentControl(actionName: #selector(segmentAction))。非常感谢。 @fs_tigre 查看我对您上一个问题的(已编辑)答案。 @vadian - 这正是我想要的。这是我的问题的确切答案。 ***.com/questions/59556459/…

以上是关于错误:点击 UISegmentedControl 时将无法识别的选择器发送到实例的主要内容,如果未能解决你的问题,请参考以下文章

当在两个布局之间快速切换使用 UISegmentedControl 时,我得到一个线程 1 exc_bad_access code=2 错误

为 UISegmentedControl 定义点击事件

UISegmentedControl 寄存器点击选定的段

在 UISegmentedControl 上记录点击在测试期间断言失败

UISegmentedControl 错误自定义处理

UISegmentedControl 分隔线错误