UILongPressGestureRecognizer не вызывает свой целевой метод

Это работало с устройствами на iOS 11, но с моим устройством, обновленным до iOS 12, это больше не работает:

//the viewcontroller is initiated with UIGestureRecognizerDelegate

let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(longPress))

//in cellForRowAt:
longPressGesture.minimumPressDuration = 1.0
longPressGesture.delegate = self
longPressGesture.cancelsTouchesInView = false
cell.addGestureRecognizer(longPressGesture)

@objc func longPress(longPressGestureRecognizer: UILongPressGestureRecognizer) {
     //never called
}

Я также попытался добавить распознаватель жестов к кнопке в viewDidLoad, чтобы убедиться, что это не проблема с табличным представлением, и функция longPress по-прежнему не вызывается.


person RanLearns    schedule 16.10.2018    source источник


Ответы (1)


//the viewcontroller is initiated with UIGestureRecognizerDelegate
let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(longPress))

Похоже, вы пытаетесь сделать longPressGesture свойством экземпляра вашего UIViewController, давая ему цель и действие как часть его инициализатора. Это не сработает, потому что во время инициализации цель self не является экземпляром. Экземпляра еще нет; экземпляр - это то, что мы сейчас создаем!

Вместо этого переместите эту строку в cellForRowAt:, например:

//in cellForRowAt:
let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(longPress))
longPressGesture.minimumPressDuration = 1.0
longPressGesture.delegate = self
longPressGesture.cancelsTouchesInView = false
cell.addGestureRecognizer(longPressGesture)
person matt    schedule 16.10.2018
comment
Это была правильная причина проблемы, с которой я столкнулся, хотя мое решение было немного другим, потому что мне все еще нужно объявить longPressGesture как свойство экземпляра, чтобы я мог добавить/удалить его позже по мере необходимости. Так что, все еще создавая его как свойство экземпляра, я теперь определяю его цель в другом месте кода, когда к себе можно получить доступ. Спасибо за вашу помощь здесь! - person RanLearns; 17.10.2018
comment
Абсолютно верно. Неважно, когда вы устанавливаете цель, если вы не делаете это как часть инициализатора свойства экземпляра по умолчанию! - person matt; 17.10.2018