Скрыть клавиатуру, когда пользователь касается uiview - PullRequest
29 голосов
/ 08 июня 2009

У меня есть UIView с несколькими текстовыми полями. Теперь я использовал делегатов для смены респондента с текстового поля на другое. В этом случае моя клавиатура пропадает, когда пользователь подходит к последнему текстовому полю.

но теперь я хочу скрыть свою клавиатуру, когда пользователь касается UIView (касается любого места на экране, кроме текстовых полей) Может ли кто-нибудь помочь мне с этим.

Спасибо

Ответы [ 11 ]

43 голосов
/ 08 июня 2009

Использование resignFirstResponder в касаниях Началось, вот так:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch * touch = [touches anyObject];
    if(touch.phase == UITouchPhaseBegan) {
        [self.myTextField resignFirstResponder];
    }
}

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

Кроме того, в Интерфейсном Разработчике вам необходимо включить флажок «Взаимодействие с пользователем включено» для представления или использовать программно:

myView.userInteractionEnabled = YES;
25 голосов
/ 11 июля 2012

Просто вызовите это в вашем контроллере представления, когда вы хотите скрыть клавиатуру.

[self.view endEditing:NO];

14 голосов
/ 18 марта 2011

Я использую

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
     UITouch *touch = [touches anyObject];
     if(touch.phase==UITouchPhaseBegan){
         //find first response view
         for (UIView *view in [self.view subviews]) {
             if ([view isFirstResponder]) {
                 [view resignFirstResponder];
                 break;
             }
         }
     }
}
3 голосов
/ 20 апреля 2013

Супер простой способ сделать это - работать с тем, что сказал PCheese.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch * touch = [touches anyObject];
if(touch.phase == UITouchPhaseBegan) {
    [self.view endEditing:YES];
}

}

Ранее я использовал [self.view endEditing:YES]; для события кнопки, но в сочетании с предыдущим ответом это срабатывает. Намного проще, и вам больше ничего не нужно делать - просто поместите это в свой файл .m. Кроме того, это работает со всеми (по крайней мере, насколько я видел) текстовыми полями (работает для UITextField и UITextView).

Я знаю, что OP, вероятно, по-прежнему не понадобится, но я просто хочу поделиться им с другими с такой же проблемой.

3 голосов
/ 08 июня 2009

Согласно Начиная разработку iPhone , вы рисуете круглую прямоугольную кнопку, чтобы она покрывала весь ваш пользовательский интерфейс; полный экран. Затем перейдите в меню Макет и нажмите Отправить на . Затем в инспекторе измените тип кнопки с round rect на Custom . Теперь добавьте к этой кнопке событие подкраски и прикрепите его к методу, который его обрабатывает. В теле этого метода убедитесь, что у вас есть операторы:

[myTextFieldOne resignFirstResponder];
[myTextFieldTwo resignFirstResponder];

В основном отправляйте сообщение resignFirstResponder каждому из ваших текстовых полей или любому полю, которое может создавать клавиатуру.

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

2 голосов
/ 07 февраля 2015

у меня это работает

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:NO];
}

нужно только в self.view иметь UItextField

http://objdev.com/2013/11/Dismissing-iOS-Keyboard-Self-View-EndEditing

2 голосов
/ 12 апреля 2011

ТАК Я мучился над этим и понял это ..

вам не нужна другая кнопка или что-то еще.

Все, что вам нужно сделать, это выбрать «Владелец файлов», в инспекторе перетащить из его выхода textField (или как вы его назвали) в фактическое текстовое поле (через то, что вы назвали его) уже подключен.

и, конечно, в дополнение к выходу Control (UIview изменен на UIControl через инспектора) для владельца файлов через backgroundtouched ... первое, что мы все попробовали

2 голосов
/ 16 июля 2009

Спасибо, Бленк, я пытался понять, как это сделать, и не осознавал, что могу поставить кнопку на заднем плане, хороший трюк! Вот мой вклад (новичок в этом сайте и в Cocoa Touch, так что он, возможно, не самый надежный код когда-либо, но пока работает):

Я вызываю этот метод из события touchUpInside на моей UIButton:

-(void)closeKeyboard:(id)sender {
    UIView *theFirstResponder = [self findFirstResponder];
    if (theFirstResponder) {
        [theFirstResponder resignFirstResponder];
    }
}

Где этот цикл находит первый ответчик:

- (UIView *)findFirstResponder {  
    UIView *firstResponderView = nil;
    for (UIView *view in [self entryFields]) {  
        if ([view isFirstResponder]) {  
            firstResponderView = view;
            break;
        }
    }   
    return firstResponderView;  
}

Он зависит от каждого элемента управления UITextField в представлении, которому назначен тег (опять же, это можно сделать в Интерфейсном Разработчике).

В любом случае, мои два цента, хотя мне лучше вернуть что-нибудь!

1 голос
/ 13 ноября 2013

Наиболее подходящим способом решения этой проблемы является использование следующего метода:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    if(![touch.view isMemberOfClass:[UITextField class]]) {
        [touch.view endEditing:YES];
    }
}

Примечание: это не работает на экземплярах UIScrollView.

1 голос
/ 11 марта 2012

Измените класс UIView на класс UIControl на вкладке идентификации инспектора. Добавьте это:

- (IBAction)tabBackground:(id) sender;

в ваш .h файл.

Добавьте это в ваш файл .m:

- (IBAction)tabBackgroup:(id) sender {
    [nameField resignFirstRespnder];
    [numberField resignFirstResponder];
}

Подключите ваш tabBackground из инспектора, раздел «Полученные действия» к UIView (который является UIControl), и все готово.

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