Скрытие клавиатуры, когда UITextField теряет фокус

Я видел несколько тем о том, как закрыть клавиатуру, когда 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];
}

P.S .: Этот код был вставлен в контроллер представления, у которого есть UITableView. UITextField находится в ячейке из этой таблицы.

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

Не могли бы вы мне помочь? Большое спасибо!


person jcborges    schedule 26.07.2010    source источник


Ответы (2)


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

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

С этим подключился к UIButton.

person Kurbz    schedule 26.07.2010

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

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

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

-(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;
}
person Seamus    schedule 12.01.2012