Если мы рассмотрим общие сценарии, в которых может быть выбрано это исключение, доступ к свойствам с объектом вверху.
Пример:
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
В методе «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
, чтобы он работал.
] Шани
Вообще говоря, мы используем ниже метод делегата, чтобы избежать прикосновений ко всем типам UIControls:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if (([touch.view isKindOfClass:[UIControl class]])) {
return NO;
}
return YES;
}
Примечание: НЕ выполняйте эту проверку (проверьте тип класса распознавателя.види), gestureRecognizerShouldBegin, это не сработает.
У меня также была та же проблема, затем я попытался с помощью
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
if ([touch.view isKindOfClass:[UIButton class]]) { //change it to your condition
return NO;
}
return YES;
}
Теперь он отлично работает .........
Лучшее решение, на мой взгляд, с помощью фрагмента кода ниже:
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
CGPoint touchLocation = [touch locationInView:self.view];
return !CGRectContainsPoint(self.menuButton.frame, touchLocation);
}
Вот версия 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)
Вот версия Swift:
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
if (touch.view!.isKindOfClass(UIButton)) {
return false
}
return true
}
Не забудьте:
UIGestureRecognizerDelegate
tapper.delegate = self
)