Xcode 7.3/Swift 2: "Без метода, объявленного с помощью Objective-C селектора"
Я использовал селектор некоторое время, и даже после перехода на Swift я смог использовать их без проблем. То, как я использовал Swift 2 без проблем, пока не обновил Xcode до версии 7.3:
![введите описание изображения здесь]()
Как видно, я использую селектор с NSTimer.
Это действие, которое вызывается:
func Start () {
}
Как вы можете видеть, Xcode 7.3 теперь дает предупреждение "Без метода, объявленного с помощью селектора Objective-C". Нажав на предупреждение, Xcode предлагает быстрое исправление кода, добавив "Селектор", но затем я все равно получаю такое же предупреждение: ![введите описание изображения здесь]()
Ответы
Ответ 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)