Подтвердить что ты не робот

Скрыть клавиатуру, когда пользователь коснется uiview

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

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

Спасибо

4b9b3361

Ответ 1

Используйте resignFirstResponder в touchhesBegan, например:

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

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

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

myView.userInteractionEnabled = YES;

Ответ 2

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

[self.view endEditing:NO];

Ответ 3

Я использую

-(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;
             }
         }
     }
}

Ответ 4

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

[myTextFieldOne resignFirstResponder];
[myTextFieldTwo resignFirstResponder];

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

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

Ответ 5

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

Ответ 6

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

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

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

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

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

Он зависит от каждого из элементов управления UITextField в представлении, имеющем назначенный им тег (опять же, это можно сделать в Interface Builder).

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

Ответ 7

SO я мучился над этим, и я понял это.

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

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

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

Ответ 8

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

- (IBAction)tabBackground:(id) sender;

в ваш .h файл.

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

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

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

Ответ 9

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

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

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