Событие касания UIButton, захваченное UIPanGestureRecognizer [дубликат]

Если мы рассмотрим общие сценарии, в которых может быть выбрано это исключение, доступ к свойствам с объектом вверху.

Пример:

string postalcode=Customer.Address.PostalCode; 
//if customer or address is null , this will through exeption

здесь, если адрес имеет значение null, то вы получите NullReferenceException.

Итак, в качестве практики мы всегда должны использовать проверку нуля, прежде чем обращаться к свойствам в таких объектах (особенно в общих)

string postalcode=Customer?.Address?.PostalCode;
//if customer or address is null , this will return null, without through a exception
95
задан Mustafa 28 January 2011 в 06:37
поделиться

6 ответов

В методе «shouldReceiveTouch» вы должны добавить условие, которое будет возвращать NO, если нажатие кнопки.

Это пример из примера SimpleGestureRecognizers .

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {

    // Disallow recognition of tap gestures in the segmented control.
    if ((touch.view == yourButton)) {//change it to your condition
        return NO;
    }
    return YES;
}

надеюсь, что это поможет

Редактировать

Как отметил Даниил, вы должны соответствовать UIGestureRecognizerDelegate, чтобы он работал.

] Шани

168
ответ дан Yuchen Zhong 5 September 2018 в 06:56
поделиться

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

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if (([touch.view isKindOfClass:[UIControl class]])) {
         return NO;
    }
    return YES;
}

Примечание: НЕ выполняйте эту проверку (проверьте тип класса распознавателя.види), gestureRecognizerShouldBegin, это не сработает.

19
ответ дан flypig 5 September 2018 в 06:56
поделиться

У меня также была та же проблема, затем я попытался с помощью

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{

    if ([touch.view isKindOfClass:[UIButton class]]) {      //change it to your condition
        return NO;
    }
    return YES;
}

Теперь он отлично работает .........

49
ответ дан forsvarir 5 September 2018 в 06:56
поделиться

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

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    CGPoint touchLocation = [touch locationInView:self.view];
    return !CGRectContainsPoint(self.menuButton.frame, touchLocation);
}
5
ответ дан Lonkly 5 September 2018 в 06:56
поделиться

Вот версия Swift 3.0:

extension UIViewController: UIGestureRecognizerDelegate {

public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    if touch.view is UIButton {
        return false
    }
    return true
}

Не забудьте:

Make your tapper object delegate to self (e.g: tapper.delegate = self)

7
ответ дан Marcelo Gracietti 5 September 2018 в 06:56
поделиться

Вот версия Swift:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    if (touch.view!.isKindOfClass(UIButton)) {
        return false
    }
    return true
}

Не забудьте:

  1. Сделайте ваш класс совместимым с UIGestureRecognizerDelegate
  2. Сделайте свой делегат объекта-манипулятора (например: tapper.delegate = self)
6
ответ дан Mustafa 5 September 2018 в 06:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: