Скрытие клавиатуры, когда UITextField теряет фокус - PullRequest
3 голосов
/ 27 июля 2010

Я видел некоторые темы о том, как отклонить клавиатуру, когда UITextField теряет фокус, но он не работал для меня, и я не знаю как.В следующем коде «touchesBegan: withEvent:» никогда не вызывается.Почему?

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [[event allTouches] anyObject];
    if ([self.textFieldOnFocus isFirstResponder] && [touch view] != self.textFieldOnFocus) {
        [textFieldOnFocus resignFirstResponder];
    }
    [super touchesBegan:touches withEvent:event];
}

PS: этот код был вставлен в контроллер представления, который имеет UITableView.UITextField находится в ячейке этой таблицы.

Итак, мое мнение таково: этот метод не вызывается, поскольку касание происходит в UITableView из моего ViewController.Итак, я думаю, что мне нужно было бы создать подкласс UITableView, чтобы использовать этот метод, как я видел в других потоках, но он может иметь более простой способ.Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 12 января 2012

Вот мое решение, несколько вдохновленное несколькими публикациями в SO: просто обработайте жест касания в контексте View, пользователь «очевидно» пытается покинуть фокус UITextField.

-(void)handleViewTapGesture:(UITapGestureRecognizer *)gesture
{
    [self endEditing:YES];
}

Это реализовано в ViewController. Обработчик добавляется в качестве распознавателя жестов к соответствующему представлению в установщике свойства представления:

-(void) setLoginView:(LoginView *)loginView
{
    _loginView = loginView;

    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self.loginView action:@selector(handleTapGesture:)];    

    [tapRecognizer setDelegate:self];  // self implements the UIGestureRecognizerDelegate protocol

    [self.loginView addGestureRecognizer:tapRecognizer];    
}

Обработчик также может быть определен в представлении. Если вы не знакомы с обработкой жестов, посмотрите документы Apple - это множество примеров в других местах.

Я должен упомянуть, что вам понадобится некоторый дополнительный код, чтобы убедиться, что другие элементы управления получают ответвления, вам нужен делегат, который реализует протокол UIGestureRecognizerDelegate, и этот метод:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{    
    if ([touch.view isKindOfClass:[UIButton class]])    // Customize appropriately.
        return NO; // Don't let the custom gestureRecognizer handle the touch   

    return YES;
}
2 голосов
/ 27 июля 2010

Убедитесь, что вы установили delegate для UITextField в First Responder в IB.И я просто поместил пользовательский (невидимый) UIButton на экран и настроил IBAction, чтобы скрыть клавиатуру.Пример:

- (IBAction)hideKeyboard {
    [someTextField resignFirstResponder];
}

С этим подключен к UIButton.

0 голосов
/ 12 января 2012
-(void)touchesEnded: (NSSet *)touches withEvent: (UIEvent *)event
 {
    for (UIView* view in self.view.subviews) 
    {
        if ([view isKindOfClass:[UITextField class]])
        [view resignFirstResponder];
    }
}
...