Ошибка: неопознанный селектор отправлен в экземпляр при нажатии на UISegmentedControl

Я получаю сообщение об ошибке, когда нажимаю на один из сегментов, чтобы запустить действие.

Есть идеи, что я делаю не так?

Ошибка:

Завершение работы приложения из-за неперехваченного исключения '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")


person fs_tigre    schedule 02.01.2020    source источник
comment
Проблема в том, что вы установили цель действия на self, что означает, что селектор будет вызываться на контроллере сегмента, а не на контроллере представления. Вероятно, вам лучше использовать шаблон делегирования или обеспечить закрытие обратного вызова   -  person Paulw11    schedule 02.01.2020


Ответы (1)


Вы, должно быть, новичок! Вы должны удалить self.addTarget(self, action: self.actionName, for: .valueChanged) в class MySegmentControl, добавить добавленную ниже функцию viewDidLoad():

segmentOne.addTarget(self, action: #selector(segmentAction(sender:)), for: .valueChanged)
person mistdon    schedule 02.01.2020
comment
Я в порядке с этим решением, но, к вашему сведению, я изначально пытался передать селектор в качестве параметра, чтобы минимизировать количество кода в ViewController и, возможно, создать UISegmentedControl с одной строкой кода, например. let segment1 = MySegmentControl(actionName: #selector(segmentAction)). Большое спасибо. - person fs_tigre; 02.01.2020
comment
@fs_tigre См. мой (отредактированный) ответ на ваш предыдущий вопрос. - person vadian; 02.01.2020
comment
@vadian - Это именно то, что я искал. Вот точный ответ на мой вопрос. stackoverflow.com/questions/59556459/ - person fs_tigre; 03.01.2020