2010-07-26 3 views
3

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

- (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, чтобы использовать этот метод, как я видел на других Threads, но это может быть проще.

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

ответ

2

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

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

С, что подключили к UIButton.

0
-(void)touchesEnded: (NSSet *)touches withEvent: (UIEvent *)event 
{ 
    for (UIView* view in self.view.subviews) 
    { 
     if ([view isKindOfClass:[UITextField class]]) 
     [view resignFirstResponder]; 
    } 
} 
2

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

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

Это реализовано в ViewController. Обработчик добавляется как жест распознаватель к соответствующему View в инкубаторе The 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; 
} 
Смежные вопросы