Swift 3: Непризнанный селектор, отправленный в экземпляр Xcode 8

Я программно создал UIView и добавил UIPanGestureRecognizer к нему:

class ViewController: UIViewController{
    var preludeView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        initViews()
        createConstrants()

        let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: Selector(("handleTap:")))
        preludeView.addGestureRecognizer(panGestureRecognizer)
    }

    func handleTap(recognizer: UIPanGestureRecognizer) {
        print("WORKING!!!!")
    }

    func initViews() {
        ...
    }

    func createConstrants() {
        ...
    }
}

Но когда я касаюсь представления, Xcode выдает ошибку:

2016-07-13 09: 24: 29.918 Draft_Hypa_02 [661: 83024] - [Draft_Hypa_02.ViewController handleTap:]: непризнанный селектор, отправленный в экземпляр 0x17d94a10 2016-07-13 09: 24: 29.921 Draft_Hypa_02 [661: 83024] * Завершение приложения из-за неперехваченного исключения 'NSInvalidArgumentException', причина: '- [Draft_Hypa_02.ViewController handleTap:]: непризнанный селектор, отправленный в экземпляр 0x17d94a10 ' * Первый стек вызова броска: (0x249cf91b 0x2416ae17 0x249d52b5 0x249d2ee1 0x248fe238 0x294ae9eb 0x290e984f 0x28f7aff1 0x294afd4f 0x28f3ba57 0x28f38017 0x28f78ec9 0x28f7867b 0x28f49125 0x28f476d3 0x24991dff 0x249919ed 0x2498fd5b 0x248df229 0x248df015 0x25ecfac9 0x28fb1189 0x93144 0x24587873) libС++ abi.dylib: завершение с помощью неперехваченное исключение типа NSException

Однако, если я удаляю аргумент в функции handleTap и удаляю двоеточие в Selector(("handleTap:")), все работает отлично!

Уже потратил день, чтобы попытаться исправить эту проблему и был бы очень признателен за вашу помощь!

Ответ 1

Если вы используете swift 3, ваш selector должен выглядеть следующим образом:

#selector(self.handleTap(recognizer:))

Ответ 2

Вы должны написать это выражение по-разному. используйте следующую строку

let panGestureRecognizer = UIPanGestureRecognizer (target: self, action: #selector (ViewController.handleTap(_:)))

вместо

let panGestureRecognizer = UIPanGestureRecognizer (target: self, action: Selector (( "handleTap:" )))

Новый способ

let panGestureRecognizer = UIPanGestureRecognizer (target: self, action: #selector (YourViewController.handleTap(_:)))

Ответ 3

class ViewController: UIViewController {

    let customView = UIView()

    override func viewDidLoad() {
        super.viewDidLoad()

        let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handleTap(_:)))
        customView.addGestureRecognizer(panGestureRecognizer)
    }

    func handleTap(panGesture: UIPanGestureRecognizer) {

    }
}

Не забудьте добавить свой пользовательский UIView в VC.