Как отключить клавиатуру при редактировании UITextField
-
07-07-2019 - |
Вопрос
Я знаю, что мне нужно сообщить моему UITextField отказаться от первого ответа, когда я хочу отключить клавиатуру, но я не уверен, как узнать, когда пользователь нажал клавишу "Готово" на клавиатуре.Есть ли уведомление, за которым я могу следить?
Решение
Я установил делегат UITextField
в свой класс ViewController
. Р>
В этом классе я реализовал этот метод следующим образом:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return NO;
}
Другие советы
Если вы подключите событие DidEndOnExit текстового поля к действию (IBAction) в InterfaceBuilder, оно будет отправлено, когда пользователь отклонит клавиатуру (с клавишей возврата), и отправитель станет ссылкой на UITextField, который сработал событие.
Например:
-(IBAction)userDoneEnteringText:(id)sender
{
UITextField theField = (UITextField*)sender;
// do whatever you want with this text field
}
Затем в InterfaceBuilder свяжите событие DidEndOnExit текстового поля с этим действием на вашем контроллере (или всем, что вы используете для связи событий из пользовательского интерфейса). Всякий раз, когда пользователь вводит текст и отклоняет текстовое поле, контроллеру будет отправлено это сообщение.
Вы также можете создать метод в вашем контроллере
-(IBAction)editingEnded:(id)sender{
[sender resignFirstResponder];
}
, а затем в Инспекторе подключений в IB connect Event " Did End On Exit " к нему.
Куби, спасибо. Ваш код сработал. Просто чтобы быть явным (для новичков, таких как), как вы говорите, необходимо установить UITextField
делегат
равным ViewController, в котором находится текстовое поле. Вы можете сделать это где угодно. Я выбрал метод viewDidLoad
.
- (void)viewDidLoad
{
// sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
daTextField.delegate = self;
}
Вот трюк для получения автоматического поведения при отключении клавиатуры без кода вообще. В наконечнике отредактируйте прокси-объект «Первый ответчик» в инспекторе удостоверений, добавив новое действие «Первый ответчик»; давайте назовем это dummy:
. Теперь подключите событие Did End on Exit текстового поля к действию dummy:
прокси-объекта First Responder. Это оно! Поскольку событие «Завершить при выходе» в текстовом поле теперь имеет целевую пару действия, текстовое поле автоматически отклоняет свою клавиатуру, когда пользователь нажимает клавишу «Return»; и поскольку нет штрафов за то, что не удалось найти обработчик для сообщения, отправленного по цепочке респондента, приложение не аварийно завершает работу, даже если нигде не реализовано dummy:
.
Просто добавьте
[textField endEditing:YES];
где вы хотите отключить клавиатуру и отобразить вид средства выбора.
В Swift вы можете написать IBAction в Контроллере и установить для этого действия Сделано в конце при выходе текстового поля для этого действия
@IBAction func returnPressed(sender: UITextField) {
self.view.endEditing(true)
}
Вы также можете использовать
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.yourTextField resignFirstResponder];
}
Лучше всего, если у вас много полей Uitext:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
Вот что я должен был сделать, чтобы заставить его работать, и я думаю, что это необходимо для любого, у кого есть цифровая клавиатура для клавиатуры (или любого другого без кнопки готово:
<Ол>Я создал функцию под названием
-(IBAction)backgroundIsTapped:(id)sender
Это также было определено в файле .h.
После этого я связался с битом «touch down» для ViewController в Интерфейсном Разработчике.
В функции 'background is tapped' я поставил это:
[answerField resignFirstResponder];
Просто не забудьте заменить answerField на имя UITextField, с которого вы хотите удалить клавиатуру (очевидно, убедитесь, что ваш UITextField определен, как показано ниже:)
IBOutlet UITextField * <nameoftextfieldhere>;
Я знаю, что эта тема, вероятно, давно умерла ... но я надеюсь, что это кому-нибудь поможет, где-то!
Вы заметите, что метод " textFieldShouldReturn " предоставляет объект текстового поля, который нажал клавишу DONE. Если вы установите TAG, вы можете включить это текстовое поле. Или вы можете отслеживать и сравнивать указатель объекта с некоторым значением члена, сохраненным его создателем.
Мой подход такой для самостоятельной работы:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
bool fDidResign = [textField resignFirstResponder];
NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");
return fDidResign;
}
Тем временем я поставил " проверку " Тест, который отрицает отставку, следует. Это только для иллюстрации, поэтому, если пользователь печатает НЕТ! в поле, это не уволят. Поведение было таким, как я хотел, но последовательность вывода была не такой, как я ожидал.
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
if( [[textField text] isEqualToString:@"NO!"] ) {
NSLog(@"%@", textField.text);
return NO;
} else {
return YES;
}
}
Ниже приведен мой вывод NSLog для этого отказа с последующим принятием. Вы заметите, что я возвращаю результат отставки, но я ожидал, что он вернет мне ЛОЖЬ, чтобы сообщить об этом вызывающей стороне ?! Помимо этого, он имеет необходимое поведение.
13.313 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:] 13.320 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:] 13.327 StudyKbd[109:207] NO! 13.333 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard 59.891 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:] 59.897 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:] 59.917 StudyKbd[109:207] -[StudyKbdViewController doneEditText]: NO 59.928 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard
Вот довольно простой способ завершить выпуск с помощью клавиши возврата или касания в фоновом режиме.
В Interface builder встроите свои поля в представление класса UIFormView
Что делает этот класс :
- Автоматически присоединяется в качестве делегата полей ( либо активируется из nib, либо добавляется вручную)
- Сохраните ссылку на текущее редактируемое поле
- Отключите клавиатуру при возврате или коснитесь в фоновом режиме
Вот этот код :
Интерфейс
#import <UIKit/UIKit.h>
@interface UIFormView : UIView<UITextFieldDelegate>
-(BOOL)textFieldValueIsValid:(UITextField*)textField;
-(void)endEdit;
@end
Реализация
#import "UIFormView.h"
@implementation UIFormView
{
UITextField* currentEditingTextField;
}
// Automatically register fields
-(void)addSubview:(UIView *)view
{
[super addSubview:view];
if ([view isKindOfClass:[UITextField class]]) {
if ( ![(UITextField*)view delegate] ) [(UITextField*)view setDelegate:self];
}
}
// UITextField Protocol
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
currentEditingTextField = textField;
}
-(void)textFieldDidEndEditing:(UITextField *)textField
{
currentEditingTextField = NULL;
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self endEdit];
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
if ([self textFieldValueIsValid:textField]) {
[self endEdit];
return YES;
} else {
return NO;
}
}
// Own functions
-(void)endEdit
{
if (currentEditingTextField) {
[currentEditingTextField endEditing:YES];
currentEditingTextField = NULL;
}
}
// Override this in your subclass to handle eventual values that may prevent validation.
-(BOOL)textFieldValueIsValid:(UITextField*)textField
{
return YES;
}
@end
Путем создания подкласса формы и переопределения
textFieldValueIsValid:
таким образом, вы можете избежать завершения редакции, если значение неверно для данного поля.Если поле имеет делегат, установленный в Interface Builder, то форма его не изменяет.Я не вижу много причин устанавливать другой делегат для определенного поля, но почему бы и нет…
Существует много способов улучшить этот класс представления формы - прикрепить делегата, выполнить некоторую разметку, обрабатывать, когда клавиатура закрывает поле ( используя фрейм currentEditingTextField ), автоматически запускать редакцию для следующего поля, ...
Я лично сохраняю его в своем фреймворке и всегда создаю подкласс для добавления функций, он довольно часто полезен "как есть".
Я надеюсь, что это поможет.Выпьем за всех
если вы хотите все редактирование в UIViewController вы можете использовать. Р>
[[self view]endEditing:YES];
и если вы хотите закрыть скрытую скрытую клавиатуру UITextField, используйте
.1. добавить делегата в ваш viewcontroller.h
<UITextFieldDelegate>
-
делает делегирование невозможным для вашего текстового поля.
self.yourTextField.delegate = self;
-
добавьте этот метод в ваш viewcontroller. Р>
- (BOOL) textFieldShouldEndEditing: (UITextField *) textField { [textField resignFirstResponder]; вернуть ДА;}
Ол>
Программно установите делегат UITextField в swift 3
Реализуйте UITextFieldDelegate в своем файле ViewController.Swift (например, класс ViewController: UIViewController, UITextFieldDelegate {)
lazy var firstNameTF: UITextField = {
let firstname = UITextField()
firstname.placeholder = "FirstName"
firstname.frame = CGRect(x:38, y: 100, width: 244, height: 30)
firstname.textAlignment = .center
firstname.borderStyle = UITextBorderStyle.roundedRect
firstname.keyboardType = UIKeyboardType.default
firstname.delegate = self
return firstname
}()
lazy var lastNameTF: UITextField = {
let lastname = UITextField()
lastname.placeholder = "LastName"
lastname.frame = CGRect(x:38, y: 150, width: 244, height: 30)
lastname.textAlignment = .center
lastname.borderStyle = UITextBorderStyle.roundedRect
lastname.keyboardType = UIKeyboardType.default
lastname.delegate = self
return lastname
}()
lazy var emailIdTF: UITextField = {
let emailid = UITextField()
emailid.placeholder = "EmailId"
emailid.frame = CGRect(x:38, y: 200, width: 244, height: 30)
emailid.textAlignment = .center
emailid.borderStyle = UITextBorderStyle.roundedRect
emailid.keyboardType = UIKeyboardType.default
emailid.delegate = self
return emailid
}()
// Пометка: - обработка делегата textField ..
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if textField == firstNameTF {
lastNameTF.becomeFirstResponder()
}
else if textField == lastNameTF {
emailIdTF.becomeFirstResponder()
}
else {
view.emailIdTF(true)
}
return true
}
Создайте функцию hidekeyboard и свяжите ее с текстовым полем в файле .xib и выберите DidEndOnExit
-(IBAction)Hidekeyboard
{
textfield_name.resignFirstResponder;
}
Если вы создали представление с помощью Interface Builder, используйте следующее Просто создайте метод,
-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}
Просто щелкните правой кнопкой мыши текстовое поле в представлении, установите для события значение «Завершить при выходе» и подключите его к методу " dismissKeyboard ".
Лучшее руководство для начинающих " Разработка приложений для iPhone и iPad Head First, второе издание "
попробуйте это
- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
if ([text isEqualToString:@"\n"]) {
[textView resignFirstResponder];
return NO;
}
return YES;
}
//====================================================
// textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField {
[textField resignFirstResponder];
if(textField.returnKeyType != UIReturnKeyDone){
[[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
}
return YES;
}
Кто ищет Swift 3
1) Убедитесь, что ваш делегат UITextField подключен к вашему ViewController в раскадровке
2) Реализуйте UITextFieldDelegate в своем файле ViewController.Swift (например, класс ViewController: UIViewController, UITextFieldDelegate {)
3) Используйте метод делегата ниже
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return false }
Вот как я отклоняю клавиатуру в Swift 4.2, и она работает для меня:
override func viewDidLoad() {
super.viewDidLoad()
let tap = UITapGestureRecognizer(target: self, action:
#selector(dismissKeyboard))
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
numberField.resignFirstResponder()
}
Swift 3, iOS 9+
@IBAction private func noteFieldDidEndOnExit(_ sender: UITextField) {}
UPD:У меня это по-прежнему прекрасно работает.Я думаю, парень, посвятивший этот ответ, просто не понимал, что ему нужно привязать это действие к UITextField в раскадровке.
textField.returnKeyType = UIReturnKeyDone;