Я использую UITextField метод статьFirstResponder, чтобы показать клавиатуру. Это работает в 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 ответов
Попробуйте позвонить в beginFirstResponder , как показано ниже.
[txtAddNew performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0];
Согласно Apple,
Объект респондента становится первым респондентом, только если текущий респондент может оставить статус первого респондента (canResignFirstResponder) и новый респондент может стать первым респондентом.
Вы можете вызвать этот метод, чтобы сделать объект респондента, например представление, первым респондентом. Однако вы должны вызывать его в этом представлении только в том случае, если оно является частью иерархии представлений. Если свойство окна представления содержит объект UIWindow, он был установлен в иерархии представления; если он возвращает nil, представление отключается от какой-либо иерархии.
resignFirstResponder
.
Swift 3
Вот быстрая 3 версия принятого ответа. Чтобы заставить его работать, мне также пришлось добавить задержку.
txtAddNew.perform(
#selector(becomeFirstResponder),
with: nil,
afterDelay: 0.1
)
Я думаю, вы пропустили addsubview
txtAddNew
на Mainview
txtAddNew.tag = 15;
[self.view addsubview:txtAddNew];
// Open keyboard
[txtAddNew becomeFirstResponder];
Добавьте эту строку в свой код. я надеюсь, что это сработает
[txtAddNew performSelectorOnMainThread:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];
Иногда помогает сначала уйти в отставку первый респондент:
var tapGesture = UITapGestureRecognizer()
tapGesture.rac_gestureSignal().subscribeNext { [weak self] (_) -> Void in
self?.inputTextField.resignFirstResponder()
self?.inputTextField.becomeFirstResponder()
}
self.charViewsContainer.addGestureRecognizer(tapGesture)
Для 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
, подключенный к моему 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()
}
}
}
Надеюсь, это поможет кому-то столкнуться с той же проблемой.
Похожие вопросы
Связанные вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.