StartFirstResponder не работает в iOS 8
Я использую метод UITextField, чтобы показать клавиатуру.
Это работает в iOS 7. Но в iOS 8 этот метод не отображает клавиатуру.
UITextField *txtAddNew = [[UITextField alloc] initWithFrame:CGRectMake(10,10,240, 21)];
txtAddNew.font = [UIFont fontWithName:@"Helvetica" size:16];
txtAddNew.clearButtonMode = UITextFieldViewModeWhileEditing;
txtAddNew.returnKeyType = UIReturnKeyDone;
txtAddNew.delegate = self;
txtAddNew.autocorrectionType = UITextAutocorrectionTypeNo;
txtAddNew.tag = 15;
// Open keyboard
[txtAddNew becomeFirstResponder];
Есть ли способ сделать это в iOS 8?
Ответы
Ответ 1
Попробуйте вызвать startFirstResponder, как показано ниже
[txtAddNew performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0];
В соответствии с Apple,
Объект-ответчик становится только первым ответчиком, если текущий ответчик может уйти с статуса первого ответчика (canResignFirstResponder) и новый ответчик может стать первым ответчиком.
Вы можете вызвать этот метод, чтобы создать объект-ответчик, такой как вид первый ответчик. Однако вы должны называть это только в том случае, если оно является частью иерархии представлений. Если свойство окна views содержит UIWindow, он был установлен в иерархии представлений; если оно возвращает nil, представление отделяется от любой иерархии.
Ответ 2
Swift 3
Вот быстрая версия 3 принятого ответа. Для меня, чтобы заставить его работать, мне также пришлось добавить задержку.
txtAddNew.perform(
#selector(becomeFirstResponder),
with: nil,
afterDelay: 0.1
)
Ответ 3
Я думаю, вы пропустили addsubview
txtAddNew
до Mainview
txtAddNew.tag = 15;
[self.view addsubview:txtAddNew];
// Open keyboard
[txtAddNew becomeFirstResponder];
Ответ 4
Иногда это помогает сначала сместить первого ответчика:
var tapGesture = UITapGestureRecognizer()
tapGesture.rac_gestureSignal().subscribeNext { [weak self] (_) -> Void in
self?.inputTextField.resignFirstResponder()
self?.inputTextField.becomeFirstResponder()
}
self.charViewsContainer.addGestureRecognizer(tapGesture)
Ответ 5
добавьте эту строку в свой код. я надеюсь, что это сработает
[txtAddNew performSelectorOnMainThread:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];
Ответ 6
Для iOS 9.3 для меня работало следующее:
private var searchTextFieldShouldReturn = false
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.searchTextFieldShouldReturn = false
self.searchTextField.becomeFirstResponder()
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
self.searchTextFieldShouldReturn = true
self.searchTextField.resignFirstResponder()
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
self.searchTextFieldShouldReturn = true
textField.resignFirstResponder()
return true
}
func textFieldShouldEndEditing(textField: UITextField) -> Bool {
return self.searchTextFieldShouldReturn
}
Так что вам нужно убедиться, что вы также реализуете делегат textFieldShouldEndEditing.
Ответ 7
На всякий случай другие имеют ту же проблему, что и я:
У меня был IBOutlet
, подключенный к моему UITextField
. Ошибочно я инициализировал это в моем методе viewDidLoad
. То есть, [[textField alloc] init];
. Я удалил это, и все снова работало.