Подтвердить что ты не робот

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?

4b9b3361

Ответ 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];. Я удалил это, и все снова работало.