Objective-C, как вообще подать в отставкуirstResponder? - PullRequest
5 голосов
/ 03 сентября 2010

(мой босс говорит), что я должен реализовать кнопку "Готово" на панели навигации, чтобы различные элементы в представлении (которые содержат поле редактирования) отклоняли свою клавиатуру (если они были в фокусе).

Кажется, что я должен перебрать все элементы, а затем вызвать resignFirstResponder для каждого из них на случай, если один из них окажется в фокусе? Это выглядит немного грязно (и трудно поддерживать, если, например, кто-то еще добавит больше элементов в будущем) - есть ли лучший способ сделать это?

Ответы [ 4 ]

12 голосов
/ 06 сентября 2010

Я нашел это!

Благодаря this

Я обнаружил, что все, что мне нужно, это: -

-(void) done {
    [[self.tableView superview] endEditing:YES];
}

// также [self.view endEditing: YES];отлично работает

[примечание] Также я узнаю, как сделать эквивалент «eventFilter», чтобы остановить UITableViewController от глотания фоновых событий касания, перехватывая их до того, как они попадут туда - из того же самого,замечательный пост в этой теме - см. "DismissableUITableView".[конец замечания]

0 голосов
/ 24 сентября 2014

Я думаю, что лучший способ справиться с этим - поиск во всех подпредставлениях основного вида с помощью рекурсивной функции, посмотрите пример ниже

- (BOOL)findAndResignFirstResponder {
if (self.isFirstResponder) {
    [self resignFirstResponder];
    return YES;
}

    for (UIView *subView in self.subviews) {
        if ([subView findAndResignFirstResponder]) {
            return YES;
        }
    }
    return NO;
}

, а также вы можете применить этот метод к своему служебному классу и использовать его из жеста касания.,Все, что вам нужно сделать, это просто добавить к жесту для просмотра.

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(hideEverything)];
[self.tableView addGestureRecognizer:gestureRecognizer];

и затем вы можете вызвать метод hideEverything;

- (void) hideKeyboard {
    [self.view findAndResignFirstResponder];
    ...
    ...
}
0 голосов
/ 03 сентября 2010

Одним из решений является использование объекта currentTextField,

В файле .h переменная экземпляра имеет вид

UITextField *currentTextField;

Теперь в файле .m.

Примечание:Не забудьте установить делегатов всех textField для этого класса

- (void)textViewDidBeginEditing:(UITextView *)textView
{
   currentTextField = textField;
}

- (void)textViewDidEndEditing:(UITextView *)textView
{
   currentTextField = nil;
}

Теперь в вашем методе действия кнопки

-(IBAction)buttonTap
{
    if([currentTextField isFirstResponder])
        [currentTextField resignFirstResponder];
}

Это позволяет избежать итерации по всему текстовому полю.

0 голосов
/ 03 сентября 2010

Вам не нужно перебирать элементы управления, так как только один может быть первым ответчиком в данный момент.

Это сбросит ответчик на само окно: [[self window] makeFirstResponder: nil]

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