Подтвердить что ты не робот

"Непризнанный селектор, посланный экземпляру" в быстром

Я понятия не имею, что я делаю неправильно. Я также новичок в программировании, поэтому я не очень хорошо разбираюсь в отладке. Это было тестовое приложение, чтобы я мог видеть, как быстрые связи с разработкой приложений. Пока у меня есть это:

class ViewController: UIViewController, UITextViewDelegate {

    var textView: UITextView!

    init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        var widthField = self.view.bounds.size.width - 10
        var heightField = self.view.bounds.size.height - 69 - 221
        var textFieldString: String! = ""
        //Set up text field
        self.textView = UITextView(frame: CGRectMake(5, 64, widthField, heightField))
        self.textView.backgroundColor = UIColor.redColor()
        self.view.addSubview(self.textView)
        //Set up the New button
        var newButtonString: String! = "New Note"
        var heightButton = 568 - heightField - 1000
        let newButton = UIButton(frame: CGRect(x: 5, y: 5, width: widthField, height: 50)) as UIButton
        UIButton.buttonWithType(UIButtonType.System)
        newButton.setTitle(newButtonString,forState: UIControlState.Normal)
        newButton.backgroundColor = UIColor.redColor()
        newButton.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside)
        self.view.addSubview(newButton)

    }

    func buttonAction() {
        println("tapped button")
    }
}

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

4b9b3361

Ответ 1

func buttonAction(){...

должен быть

func buttonAction(sender:UIButton!)
{
    println("tapped button")
}

Из-за newButton action: "buttonAction:" так.

Ответ 2

Если у вас есть двоеточие в имени селектора (buttonAction:), вы должны иметь отправителя в качестве аргумента для функции buttonAction, если у вас нет двоеточия в имени, отправитель не будет отправлен.

Ответ 3

Есть две другие причины, по которым я столкнулся, что может привести к этому типу ошибок:

1) Когда первый аргумент addTarget не наследуется от NSObject. Например, это не сработает:

class MyClass {
    init(button: UIButton) {
        button.addTarget(
            self,
            action: Selector("onClick:"),
            forControlEvents: UIControlEvents.TouchUpInside)
    }

    func onClick(sender: AnyObject?) {
        //Gotcha!
    }
}

}

Чтобы исправить только изменение:

class MyClass: NSObject
...

2) Если вы не используете явную ссылку для экземпляра с селектором. Например, если вы используете тот же код:

func crashMe() {
    var delegate = MyClass(button)
}

Swift кажется мусором собирать "делегат", даже если он прослушивает кнопку, поэтому произойдет сбой. Чтобы исправить, измените что-то вроде этого:

func crashMe() {
    self.delegate = MyClass(button)
}

Я также столкнулся с проблемами "private" и "crashMe" по сравнению с проблемами "crashMe:" при разработке моего приложения... Следовательно, уделив время, чтобы написать это сообщение, чтобы суммировать ловушки, на которые вы столкнетесь.:)

Ответ 4

Получил эту работу, добавив "_" перед аргументом. см. фрагмент ниже

func buttonAction(sender:UIButton)  // this was throwing the error "unrecognized selector sent to instance"
{
    println("tapped button")
}

func buttonAction(_ sender:UIButton)  // added an "_ " before sender
{
    println("tapped button")
}

Ответ 5

Синтаксис должен быть

@IBAction func buttonAction(_ sender: UIButton) {
     print('tapped')
 }

Синтаксис - это проблема или

У кнопки на раскадровке есть несколько зарегистрированных действий. Чтобы узнать, как просто щелкнуть правой кнопкой мыши, и вы должны уметь видеть, сколько соединений есть

если прикосновение внутри имеет более одного соединения, удалите его. Это связано с тем, что если у вас есть несколько соединений, и вы нажимаете на элемент управления, компилятор будет смущен, какой он должен реализовать

Ответ 6

при использовании методов performSelector() ваш метод (соответствующий селектору) должен быть помечен как @objc

{  
    //...
    performSelector(Selector("myMethod"), withObject: nil, afterDelay: 0.3)
    //...

    // or in swift 2.2
    performSelector(#selector(ClassName.myMethod), withObject: nil, afterDelay: 0.3)
    //

    // or in swift 3
    perform(#selector(ClassName.myMethod), with: nil, afterDelay: 0.3)
    //

}

@objc private func myMethod() { }

Ответ 7

В вашем представленииDidLoad обратите внимание, что мой Селектор вызывает мою функцию с двоеточием.

override func viewDidLoad() {
        super.viewDidLoad()
        // init gesture recognizer swipe right vars
        var rightSwipe = UISwipeGestureRecognizer(target: self, action: Selector("gestureFunc:"))
        rightSwipe.direction = UISwipeGestureRecognizerDirection.Right
        view.addGestureRecognizer(rightSwipe) 
    }

Затем убедитесь, что функция Selector i.e. готова к ее прокрутке:

        // selector from UISwipeGestureRecognizer
        func nextWeapon(gesture: UISwipeGestureRecognizer) {
        println("swipe right")
        }

Ответ 8

Добавление функции @IBAction к вашему коду с последующим удалением или переименованием без обновления раскадровки также приведет к этой ошибке.

Посмотрите на селектор в сообщении об ошибке:

'-[HelloWorld.ViewController yourActionFunction:]: unrecognized selector sent to instance 0x157e0c830'
                             ^^^^^^^^^^^^^^^^^^

У вас есть функция с именем yourActionFunction? Если нет, выберите раскадровку и отредактируйте соединения на вашем элементе управления (например, кнопку).

Ответ 9

Для тех, кто оказывается в моих руках: если вы создаете свою кнопку в статическом контексте, убедитесь, что вы передали правильную цель UIButton.addTarget(_:action:for:). Передача self приведет к передаче типа, а не экземпляра.