У мене є UITextfield, для якого я хотів би відмовитися від клавіатури. Здається, я не можу змусити клавіатуру зникнути незалежно від того, який код я використовую.
У мене є UITextfield, для якого я хотів би відмовитися від клавіатури. Здається, я не можу змусити клавіатуру зникнути незалежно від того, який код я використовую.
Відповіді:
[myTextField resignFirstResponder]
Ось другий абзац розділу Відображення та приховування клавіатури.
Якщо у вас є кілька текстових полів, і ви не знаєте, який із них відповідає першим (або у вас просто немає доступу до текстових полів звідки б ви не писали цей код), ви можете зателефонувати endEditing:
в батьківському поданні, що містить текстові поля.
У методі контролера подання це виглядатиме так:
[self.view endEditing:YES];
Параметр змушує текстове поле звільнитись із статусу першого відповідача. Якщо ви використовували делегата для перевірки і хотіли зупинити все, доки вміст текстового поля не буде дійсним, ви можете також кодувати його так:
BOOL didEndEditing = [self.view endEditing:NO];
if (didEndEditing) {
// on to the next thing...
} else {
// text field must have said to first responder status: "never wanna give you up, never wanna let you down"
}
endEditing:
Метод набагато краще , ніж говорити окремі текстові поля resignFirstResponder
, але з якоїсь - то причини я навіть не дізнався про це до недавнього часу .
Бувають випадки, коли текстове поле не є першим відповідачем, але клавіатура знаходиться на екрані. У цих випадках вищевказані методи не дозволяють відхилити клавіатуру.
Один приклад того, як туди дістатися:
У цьому випадку вам також потрібно попросити контролер перегляду вийти з режиму редагування:
[viewController setEditing:NO animated:YES];
Я виявив випадок, коли endEditing
і resignFirstResponder
не вдається. Це спрацювало для мене в тих випадках.
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
[self setEditing:NO];
UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)
Пропоную додати та вжити дії щодо вашого заголовного файлу:
-(IBAction)removeKeyboard;
А у реалізації напишіть щось на зразок цього:
-(IBAction)removeKeyboard
{
[self.textfield resignFirstResponder];
}
У файлі NIB підключіться з UITextFiled до власника файлу за опцією DidEndOnExit. Таким чином, при натисканні клавіші повернення клавіатура зникне.
Сподіваюся, це допоможе!
У своєму файлі контролера перегляду YourViewController.h переконайтеся, що ви реалізуєте протокол UITextFieldDelegate:
@interface YourViewController : <UITextFieldDelegate>
@end
Потім у файлі YourViewController.m реалізуйте такий метод екземпляра:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.yourTextField1 resignFirstResponder];
[self.yourTextField2 resignFirstResponder];
...
[self.yourTextFieldn resignFirstResponder];
}
Це звільнить одне конкретне текстове поле
// Swift
TextField.resignFirstResponder()
// Objective C
[TextField resignFirstResponder];
Щоб звільнити будь-яке текстове поле, використовуйте код нижче
// Swift
self.view!.endEditing(true)
// Objective C
[self.view endEditing:YES];
Звільнити будь-яке текстове поле в програмі
UIApplication.shared.keyWindow?.endEditing(true)
Цей підхід є чистим і гарантовано працює, оскільки keyWindow є, за визначенням, кореневим видом усіх можливих видів, що відображають клавіатуру ( джерело ):
У вікні клавіш приймаються клавіатура та інші події, не пов’язані з дотиком. Лише одне вікно за раз може бути ключовим вікном.
в крайньому випадку 💩
let dummyTextView = UITextView(frame: .zero)
view.addSubview(dummyTextView)
dummyTextView.becomeFirstResponder()
dummyTextView.resignFirstResponder()
dummyTextView.removeFromSuperview()
UITextField
першого реагуючого, але вікно, що відображає пропозиції, також активне. Закриття клавіатури кнопкою приховування якось не приховувало клавіатуру. Цей код мені тут допоміг, дякую! :)
Якщо ви не знаєте, який textField є першим відповідачем, ви можете його знайти. Я використовую цю функцію:
UIView *resignFirstResponder(UIView *theView)
{
if([theView isFirstResponder])
{
[theView resignFirstResponder];
return theView;
}
for(UIView *subview in theView.subviews)
{
UIView *result = resignFirstResponder(subview);
if(result) return result;
}
return nil;
}
Потім у коді виклику:
UIView *resigned = resignFirstResponder([UIScreen mainScreen]);
-(void)methodName
{
[textFieldName resignFirstResponder];
}
викличте цей метод (methodName) за допомогою didEndOnExit
Для Свіфта 3
Клавіатуру можна сховати так:
textField.resignFirstResponder()
Якщо ви хочете приховати клавіатуру, коли користувач натискає кнопку "вступ", вам доведеться застосувати такий UITextFieldDelegate
спосіб:
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
// your code
[textField reloadInputViews];
}
3 простих і швидких кроки
Додайте UITextFieldDelegate
до свого класу, як показано нижче:
class RegisterVC: UIViewController, UITextFieldDelegate {
//class implementation
}
у реалізації класу додайте функцію делегата textFieldShouldEndEditing:
:
internal func textFieldShouldReturn(_ textField: UITextField) -> Bool {
self.view.endEditing(true)
return true
}
і на останньому етапі встановіть своїх UITextField
делегатів (-ів) на себе, десь доречно. Наприклад, всередині viewDidLoad
функції:
override func viewDidLoad(){
super.viewDidLoad()
myTextField1.delegate = self
myTextField2.delegate = self
..
..
}
Тепер, коли користувач натискає клавішу повернення, клавіатура відхиляється.
Я також підготував прикладний фрагмент, ви можете перевірити його звідси .