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

Xcode 7.3/Swift 2: "Без метода, объявленного с помощью Objective-C селектора"

Я использовал селектор некоторое время, и даже после перехода на Swift я смог использовать их без проблем. То, как я использовал Swift 2 без проблем, пока не обновил Xcode до версии 7.3:

введите описание изображения здесь

Как видно, я использую селектор с NSTimer.

Это действие, которое вызывается:

 func Start () {

 }

Как вы можете видеть, Xcode 7.3 теперь дает предупреждение "Без метода, объявленного с помощью селектора Objective-C". Нажав на предупреждение, Xcode предлагает быстрое исправление кода, добавив "Селектор", но затем я все равно получаю такое же предупреждение: введите описание изображения здесь

4b9b3361

Ответ 1

Так как Swift 2.2/Xcode 7.3 существует новый способ использования селектора: Selector("funcName") был изменен на #selector(ClassName.funcName)

Посмотрите https://github.com/apple/swift-evolution/blob/master/proposals/0022-objc-selectors.md,

TL;DR;

Замените Selector("Start") на #selector(YOUR_CLASS.Start)

где YOUR_class= класс цели в данном контексте.

Если вы не хотите делать это вручную, Xcode обеспечивает простое исправление по умолчанию, когда у вас есть следующая ситуация, нажмите Желтые треугольники (иногда требуется несколько раз нажать/кликнуть),

введите описание изображения здесь

он даст вам предложение: введите описание изображения здесь

И если вы выберете это предложение, оно автоматически обновит селектор: введите описание изображения здесь

Ответ 2

Оба следующих утверждения работают отлично. В основном используется верхний. Однако, когда метод выбора находится в другом ViewController, может появиться сообщение о компиляторе "No method, объявленный с помощью Objective-C" buttonHandler ".

Вторая заявленная инструкция не дает этого предупреждения.

button.addTarget(parentViewController, action: Selector("buttonHandler:"), forControlEvents: .TouchUpInside)

button.addTarget(parentViewController, action: #selector(MainViewController.buttonHandler), forControlEvents: .TouchUpInside)

В контроллере целевого представления (MainViewController) вы можете определить модуль:

func buttonHandler(sender:UIButton!) {
    print ("Pressed")
}

Ответ 3

В Swift 4 мне пришлось добавить @objc перед func, чтобы избавиться от предупреждений.

Вот как я вызываю func с NSTimer:

 Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.intro), userInfo: nil, repeats: false)

Вот как объявлен func:

     @objc func intro () {

          // do your stuff here         

     }

Я также обновил настройку в соответствии с запросом Xcode:

введите описание изображения здесь

Больше никаких предупреждений, все работает нормально.

Ответ 4

Некоторые мои выводы, чтобы поддержать то, что сказал Винсент (слишком долго, чтобы быть прямым комментарием)

Это не обязательно в другом контроллере представления, а просто в другом файле, где следующий формат не будет работать:

button.addTarget(parentViewController, action: Selector("buttonHandler:"), forControlEvents: .TouchUpInside)

Например, если у вас есть расширение в отдельном файле, хотя для одного и того же контроллера представления этот формат Selector("buttonHandler:") не будет работать.

Кроме того, когда селектор находится в одном файле и VC, быстрое исправление Xcode предлагает вам включить селектор конструктора, чтобы он выглядел примерно так:

#selector(MainViewController.buttonHandler(_:))

Однако этот формат работает только тогда, когда селектор находится в одном файле VC +, если он находится в отдельном файле, но тот же VC, то этот рекомендованный метод не будет работать, и вам нужно использовать метод без конструктора

#selector(MainViewController.buttonHandler)