Почему на моей кнопке очистки textField вызывается UIGestureRecognizer? - PullRequest
12 голосов
/ 25 августа 2011

У меня есть UITableView с добавленным распознавателем жестов:

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
[myTableView addGestureRecognizer:gestureRecognizer];
gestureRecognizer.cancelsTouchesInView = NO;

... все отлично работает при нажатии на просмотр таблицы, чтобы закрыть клавиатуру.Моя проблема в том, что мой метод hideKeyboard также вызывается при нажатии на кнопку «очистить» на моем UITextField.Очень странно.

commentTextField = [[UITextField alloc] initWithFrame:CGRectMake(5, 5, 310, 35)];
commentTextField.contentVerticalAlignment =UIControlContentVerticalAlignmentCenter;
commentTextField.borderStyle = UITextBorderStyleRoundedRect;
commentTextField.textColor = [UIColor blackColor]; //text color
commentTextField.font = [UIFont fontWithName:@"Helvetica" size:14.0];  //font size
commentTextField.placeholder = @"Enter a comment...";  //place holder
commentTextField.autocorrectionType = UITextAutocorrectionTypeNo;   // no auto correction support
commentTextField.keyboardType = UIKeyboardTypeDefault;  // type of the keyboard
commentTextField.returnKeyType = UIReturnKeySend;  // type of the return key
commentTextField.clearButtonMode = UITextFieldViewModeAlways;   // has a clear 'x' button to the right
commentTextField.delegate = self;
[commentTextField setHidden:NO];
[commentTextField setEnabled:YES];
[commentTextField setDelegate: self];

hide keyboard method:
 - (void) hideKeyboard{

if(keyboard){

   [commentTextField resignFirstResponder];

    [UIView animateWithDuration:.3 
                  delay:.0
                options:UIViewAnimationCurveEaseInOut 
             animations:^{ // start animation block                   

                 [myTableView setFrame:CGRectMake(0, myTableView.frame.origin.y + 216, myTableView.frame.size.width, myTableView.frame.size.height)];

             } 
             completion:^(BOOL finished){


             }];

    keyboard = 0;
}
 }

Любая помощь будет оценена, спасибо!

Ответы [ 3 ]

23 голосов
/ 06 февраля 2012

Следующее является более общим - оно не связано с вашими конкретными представлениями:

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

Кроме того, не забудьте установить делегат для распознавателя жестов и пометить класс как реализующийUIGestureRecognizerDelegate протокол.

7 голосов
/ 08 ноября 2011

У меня была такая же проблема. Я также реализовал следующий метод на мой взгляд:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if ((touch.view == self.textField) && (gestureRecognizer == self.tapGestureRecognizer))
    {
        return NO;
    }

    return YES;
}

Но все равно это не сработало. Поэтому я установил перерыв в методе и увидел, что когда я щелкаю поле, для него устанавливается touch.view, но когда я нажимал кнопку очистки, он появлялся как UIButton *. В тот момент было очевидно, что происходит и что нужно сделать, чтобы это исправить. Ниже решен вопрос.

if((touch.view == self.textField || [self.textField.subviews containsObject:touch.view]) && (gestureRecognizer == self.tapGestureRecognizer))
{
     return NO;
}
1 голос
/ 31 июля 2013

Моя проблема с подходом Ezmodius заключается в том, что он зависит от свойства, называемого textField, и мой UIViewController является контроллером, от которого наследуются все остальные мои UIViewController, поэтому мне нужно было реализовать более общий подход: всякий раз, когда текстовое поле находилось в любой UIViewController, который нужно очистить, я реализовал следующее (внутри того же метода gestRecognizer:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([touch.view isKindOfClass:[UITextField class]] ||
    ([touch.view isKindOfClass:[UIButton class]] && [touch.view.superview isKindOfClass:[UITextField class]]))
{
    return NO;
}

return YES;
}

Таким образом, в основном я проверяю, является ли это текстовым полем или кнопкой, суперпредставление которой является текстовым полем (в данном случае, кнопкой очистки внутри текстового поля), и оно работает для меня как обаяние. Я реализовал это в своем базовом классе UIViewController, и он работает для каждой страницы, где это происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...