Я знаю, что мне нужно сообщить своему UITextField об увольнении первого респондента, когда я хочу отключить клавиатуру, но я не уверен, как узнать, когда пользователь нажал клавишу «Готово» на клавиатуре. Есть ли уведомление, которое я могу посмотреть?
Как отключить клавиатуру при редактировании UITextField
Ответы (20)
Я установил делегата UITextField
в свой ViewController
класс.
В этом классе я реализовал этот метод следующим образом:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return NO;
}
NO
вместо YES
?
- person Iulian Onofrei; 30.01.2019
NO
, вы избегаете добавления к тексту возврата строки.
- person kubi; 21.02.2019
YES
, и он не добавляет строки к тексту.
- person Iulian Onofrei; 21.02.2019
func textFieldShouldClear(_ textField: UITextField) -> Bool { DispatchQueue.main.async { self.resignFirstResponder() } return true }
- person alekop; 22.08.2019
Если вы подключите событие 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 подключите к нему событие «Did End On Exit».
DidEndOnExit
, вам не нужно вызывать resignFirstResponder
. Вы можете проверить это, установив символическую точку останова на [UIResponder resignFirstResponder]
. Обратите внимание, что даже если вы не вызовете resignFirstResponder, он все равно будет вызван системой. Это объясняется в превосходной книге (-ах) Мэтта Нойбурга: apeth.com/iOSBook/ а>
- person Chris Conover; 24.04.2015
куби, спасибо. Ваш код работал. Чтобы быть явным (например, для новичков), как вы говорите, вы должны установить UITextField
delegate
равным 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;
}
delegate
текстового поля. Вам не нужно делать это программно, как показано выше. Любой из подходов работает нормально.
- person Rob; 18.01.2013
Вот трюк, позволяющий получить автоматическое отключение клавиатуры вообще без кода. В перо отредактируйте прокси-объект First Responder в Инспекторе удостоверений, добавив новое действие первого респондента; назовем это dummy:
. Теперь подключите событие Did End on Exit текстового поля к действию dummy:
прокси-объекта First Responder. Вот и все! Так как событие Did End on Exit текстового поля теперь имеет пару действие – цель, текстовое поле автоматически закрывает клавиатуру, когда пользователь нажимает Return; и поскольку нет наказания за то, что не найден обработчик для сообщения, отправленного вверх по цепочке респондента, приложение не аварийно завершает работу, даже если нигде нет реализации dummy:
.
Просто добавь
[textField endEditing:YES];
где вы хотите отключить клавиатуру и отобразить окно выбора.
В Swift вы можете написать IBAction в контроллере и установить событие Did End On Exit текстового поля для этого действия.
@IBAction func returnPressed(sender: UITextField) {
self.view.endEditing(true)
}
Swift 4.2
и он будет работать на 100%
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.textField.delegate = self
}
// hide key board when the user touches outside keyboard
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
// user presses return key
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
Вы также можете использовать
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.yourTextField resignFirstResponder];
}
Лучше всего, если у вас много Uitextfields:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
Вот что мне нужно было сделать, чтобы заставить его работать, и я думаю, что это необходимо любому, у кого есть цифровая клавиатура для клавиатуры (или любые другие без кнопки «Готово»:
- Я изменил UIView в ViewController на UIControl.
Я создал функцию под названием
-(IBAction)backgroundIsTapped:(id)sender
Это также было определено в файле .h.
После этого я связался с битом «касания» для ViewController в Интерфейсном Разработчике.
В функции 'фоновое нажатие' я поставил следующее:
[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;
}
Между тем, я поставил «проверочный» тест, который отрицает отставку. Это только для иллюстрации, поэтому, если пользователь вводит NO! в поле его не уволят. Поведение было таким, как я хотел, но последовательность вывода была не такой, как я ожидал.
- (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
Вот довольно простой способ завершить редактирование с помощью клавиши возврата или касания в фоновом режиме.
В конструкторе интерфейсов вставьте свои поля в представление класса UIFormView.
Что делает этот класс:
- Автоматически присоединяться как делегат полей (либо пробужденный из пера, либо добавленный вручную)
- Сохранить ссылку на текущее редактируемое поле
- Отключите клавиатуру при возврате или коснитесь в фоновом режиме
Вот код:
Интерфейс
#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:
, вы можете избежать завершения редактирования, если значение не является правильным для данного поля.Если поле имеет делегат, установленный в Интерфейсном Разработчике, то форма не изменяет его. Я не вижу много причин для установки другого делегата для определенного поля, но почему бы и нет…
Есть много способов улучшить этот класс представления формы - прикрепить делегата, сделать некоторую компоновку, обработать, когда клавиатура покрывает поле (используя фрейм currentEditingTextField), автоматически запустить редакцию для следующего поля, ...
Я лично держу его в своей структуре и всегда делаю подклассы для добавления функций, он довольно часто бывает полезен «как есть».
Надеюсь, это поможет. Приветствую всех
если вы хотите, чтобы все редактировалось в UIViewController, вы можете использовать.
[[self view]endEditing:YES];
и если вы хотите отклонить скрытую клавиатуру UITextField, используйте.
1. добавьте делегата в свой viewcontroller.h
<UITextFieldDelegate>
сделать делегирование невозможным для вашего текстового поля.
self.yourTextField.delegate = self;
добавьте этот метод в свой viewcontroller.
- (BOOL) textFieldShouldEndEditing: (UITextField *) textField {[textField resignFirstResponder]; вернуть ДА;}
Программно установить делегата UITextField в быстром 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».
Лучшее руководство для новичков - "Head First Разработка для iPhone и iPad, 2-е издание".
попробуй это
- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
if ([text isEqualToString:@"\n"]) {
[textView resignFirstResponder];
return NO;
}
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 в раскадровке.