СтатьFirstResponder не работает в iOS 8

Я использую метод UITextField beFirstResponder для отображения клавиатуры. Это работает в 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?


person Tejas Bharambe    schedule 24.11.2014    source источник
comment
Я не вижу, чтобы вы добавляли это текстовое поле в какое-либо представление в качестве подпредставления.   -  person Kris Gellci    schedule 24.11.2014


Ответы (8)


Попробуйте вызвать becomeFirstResponder, как показано ниже.

[txtAddNew performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0];

Согласно Apple,

Объект респондента становится первым респондентом только в том случае, если текущий респондент может отказаться от статуса первого респондента (canResignFirstResponder), а новый респондент может стать первым респондентом.

Вы можете вызвать этот метод, чтобы сделать объект респондента, такой как представление, первым респондентом. Однако вы должны вызывать его только для этого представления, если оно является частью иерархии представлений. Если свойство окна представления содержит объект UIWindow, оно было установлено в иерархии представлений; если он возвращает nil, представление отсоединяется от какой-либо иерархии.

person thavasidurai    schedule 24.11.2014
comment
Странно, как это работает, когда [txtAddNew beFirstResponder] не работает в случаях. В чем разница? - person mskw; 12.01.2017
comment
@mskw Вероятно, потому что вызов селектора заставляет resignFirstResponder. - person Pedro Paulo Amorim; 10.04.2020

Свифт 3

Вот версия принятого ответа Swift 3. Чтобы заставить его работать, мне также пришлось добавить задержку.

txtAddNew.perform(
    #selector(becomeFirstResponder), 
    with: nil, 
    afterDelay: 0.1
)
person Jacob Arvidsson    schedule 19.12.2016

Я думаю, вы пропустили addsubview txtAddNew до Mainview

   txtAddNew.tag = 15;
   [self.view addsubview:txtAddNew];  

   // Open keyboard
  [txtAddNew becomeFirstResponder];
person Anbu.Karthik    schedule 24.11.2014

добавьте эту строку в свой код. я надеюсь, что это сработает

[txtAddNew performSelectorOnMainThread:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];
person Sport    schedule 24.11.2014

Свифт 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()
        }
    }
}

Надеюсь, это поможет кому-то, кто столкнулся с той же проблемой.

person Derek Hierholzer    schedule 13.02.2018

Иногда помогает сначала уволить первого респондента:

var tapGesture = UITapGestureRecognizer()
tapGesture.rac_gestureSignal().subscribeNext { [weak self] (_) -> Void in
    self?.inputTextField.resignFirstResponder()
    self?.inputTextField.becomeFirstResponder()
}

self.charViewsContainer.addGestureRecognizer(tapGesture)
person Antoine    schedule 13.04.2015
comment
это сработало для меня, есть ли документация Apple, которая привела вас к этому? - person Austin; 19.09.2017

Для 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.

person Zoltan Varadi    schedule 08.04.2016

На всякий случай, если у других такая же проблема, как у меня:

У меня был IBOutlet, подключенный к моему UITextField. Я ошибочно инициализировал это в своем методе viewDidLoad. То есть [[textField alloc] init];. Я удалил это, и все снова заработало.

person espitia    schedule 27.05.2016