becomeFirstResponder не работает в iOS 8
Я использую метод UITextField becomeFirstResponder для отображения клавиатуры. Это работает в 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?
8 ответов
позвонить becomeFirstResponder ниже
[txtAddNew performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0];
согласно Apple,
объект ответчика становится только первым, если текущая ответчик может отказаться от статуса первого ответчика (canResignFirstResponder) и новый ответчик может стать первым ответчиком.
вы можете вызвать этот метод, чтобы сделать объект ответчика, таких как просмотр первый ответчик. Однако вы должны вызывать его только в этом представлении, если он есть часть иерархии представлений. Если свойство window вида содержит Объект UIWindow, он был установлен в иерархии представлений; если он возвращает nil, представление отделено от любой Иерархии.
Swift 3
вот версия swift 3 принятого ответа. Для меня, чтобы заставить его работать мне пришлось добавить задержку.
txtAddNew.perform(
#selector(becomeFirstResponder),
with: nil,
afterDelay: 0.1
)
и addsubview
на txtAddNew
до Mainview
txtAddNew.tag = 15;
[self.view addsubview:txtAddNew];
// Open keyboard
[txtAddNew becomeFirstResponder];
иногда это помогает сначала подать в отставку первого ответчика:
var tapGesture = UITapGestureRecognizer()
tapGesture.rac_gestureSignal().subscribeNext { [weak self] (_) -> Void in
self?.inputTextField.resignFirstResponder()
self?.inputTextField.becomeFirstResponder()
}
self.charViewsContainer.addGestureRecognizer(tapGesture)
добавьте эту строку в код . надеюсь, это сработает
[txtAddNew performSelectorOnMainThread:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];
для 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.
на всякий случай у других такая же проблема, как у меня:
Я IBOutlet
подключен к my UITextField
. Ошибочно я инициализировал это в моем viewDidLoad
метод. То есть, [[textField alloc] init];
. Я удалил это, и все снова сработало.
Swift 4 и iOS 11
в моем случае, что бы я ни пытался, я не смог установить первый ответчик, пока не попробовал это.
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if cell.isKind(of: YOURTABLEVIEWCELL.self) {
if let yourCell = cell as? YOURTABLEVIEWCELL{
yourCell.yourUiTextField.becomeFirstResponder()
}
}
}
надеюсь, это поможет кому-то застрять с той же проблемой.