Как заставить пропадать клавиатуру?

У меня есть текстовое поле, которое отображается в UITableViewCell, и я хочу иметь возможность скрыть клавиатуру, когда пользователь касается любого другого места на экране, кроме текстового поля. Я знаю о [поле resignFirstResponder];, но я не знаю, как перехватывать касания на фоне UITableView, чтобы вызвать «resignFirstResponder».

Любая помощь будет принята с благодарностью.


person Raphael Caixeta    schedule 09.08.2010    source источник


Ответы (5)


Единственный способ сделать это - создать подкласс UITableView, реализовать метод touchesBegan в подклассе UITableView и отправить объекты UITextField в UITableView. Вот как это должно выглядеть -

//  GRTableView.h
//  StackOverflow Example
//
//  Created by Raphael Caixeta on 8/13/10.
//  Copyright 2010 Raphael Caixeta. All rights reserved.
//

#import <UIKit/UIKit.h>


@interface GRTableView : UITableView <UITableViewDelegate> {

    UITextField *textField;

}

@property(nonatomic, retain) UITextField *textField;

@end

//
//  GRTableView.m
//  StackOverflow Example
//
//  Created by Raphael Caixeta on 8/13/10.
//  Copyright 2010 Raphael Caixeta. All rights reserved.
//

#import "GRTableView.h"

@implementation GRTableView
@synthesize textField;

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [textField resignFirstResponder];
    [super touchesBegan:touches withEvent:event];       
}

- (void)dealloc {
    [super dealloc];
}


@end

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

person Raphael Caixeta    schedule 13.08.2010
comment
Это не единственный способ сделать это. Смотрите также другие действительные ответы в списке. - person Chris Garrett; 20.08.2010
comment
Попробуйте сами. Вы увидите, что нажатие на фон UITableView будет заблокировано. Вы действительно думаете, что я бы потрудился создать пример, если бы другие примеры работали? - person Raphael Caixeta; 20.08.2010

Попробуйте реализовать - (void)textFieldDidEndEditing:(UITextField *)textField метод UITextFieldDelegate.

person Stephen Darlington    schedule 09.08.2010

Это очень просто: создайте прозрачный объект UIView, который получает касания в нужной области, и когда касание находится в границах этого представления, вызовите resignFirstResponder.

// somewhere in a view controller
UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
[self.view addSubview:backgroundView];

// in the touchesBegan:withEvent: method, for example
UITouch *touch = [[event allTouches] anyObject];

if ([field isFirstResponder] && [touch view] == backgroundView) {
    [field resignFirstResponder];
}

В качестве альтернативы вы можете пропустить материал backgroundView и просто добавить условный оператор, подобный следующему, в вашем методе touchesBegan: withEvent::

UITouch *touch = [[event allTouches] anyObject];

if ([field isFirstResponder] && [touch view] != field) {
    [field resignFirstResponder];
}

Если тач есть! (не) в пределах field, тогда вы хотите удалить клавиатуру.

person Arseniy Banayev    schedule 09.08.2010
comment
По какой-то причине мой метод touchesBegan не вызывается. Любой совет? В My View и UITableView для userInteractionEnabled и multipleTouchEnabled установлено значение YES. - person Raphael Caixeta; 09.08.2010
comment
Убедитесь, что метод touchesBegan: withEvent: имеет правильную подпись и реализован в UIViewController, а не в самом представлении. - person Arseniy Banayev; 09.08.2010

Вы можете скрыть клавиатуру при следующих условиях:

    • (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { }
    • (void)TextField:(UITextField *)TxtFld textDidChange:(NSString *)searchText{ }

В этих двух условиях вы должны поместить [TxtFld resignFirstResponder]; А также, когда ваша работа с текстовым полем закончена, вы выполняете некоторые действия с этим событием, вы также должны написать [TxtFld resignFirstResponder]; где TxtFld - объект для поля UIText.

При использовании этой вещи клавиатура будет закрыта. Написанный вами метод касания может не работать на UITableviewCell. так что это будет способ скрыть клавиатуру.

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

person V.V    schedule 16.08.2010

Есть более простой способ сделать это, чем стандартный «подкласс UITableView» или «добавить подкласс UIView и обрабатывать касания». Я создаю UIButton с четким цветом фона над областью, которую я хочу обрабатывать касаниями. Когда я добавляю его в представление, я устанавливаю его скрытое свойство на YES.

Когда текстовое поле начинает редактирование, я устанавливаю для скрытого свойства кнопки значение NO.

Затем кнопка просто реагирует на событие элемента управления UITouchUpInside в методе, который вызывает [textField resignFirstResponder] и button.hidden = YES.

person Chris Garrett    schedule 19.08.2010