Swift: стать первым ответчиком на UITextField не работает?

Я создал собственный UIViewController с одним UITextField на раскадровке. На viewDidLoad я установил UITextFIeld на becomeFirstResponder, ничего не произошло (клавиатуры не появлялись).

Затем я попытался вызвать resignFirstResponder(), но он вернул ложь. Затем я попытался найти, кто first responder, зациклив все подпредставления, используя код над @ Получить текущий первый ответчик без использования частного API. Оказывается, ни одно из подпредставлений не является первым ответчиком.

Мой ViewController в раскадровке

введите здесь описание изображения

Мой код

class BLTestViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var tf: UITextField

    override func viewDidLoad() {
        super.viewDidLoad()

        tf.delegate = self
        tf.becomeFirstResponder()
        // Do any additional setup after loading the view.
    }
}

Все просто... ПОЧЕМУ НЕ ПОДНИМАЕТСЯ КЛАВИАТУРА!!! У меня есть одна вещь — автоматическая раскладка, но я не уверен, влияет ли это на всплывающую клавиатуру.


person blee908    schedule 17.08.2014    source источник
comment
Попробуйте сделать текстовое поле первым ответчиком в viewWill/DidAppear:.   -  person duci9y    schedule 18.08.2014
comment
Пробовал оба, не повезло.   -  person blee908    schedule 18.08.2014
comment
Подключено ли текстовое поле к вашему контроллеру представления через выходное соединение?   -  person duci9y    schedule 18.08.2014
comment
быстрая идея, я думаю, вы все еще можете вызывать ее слишком рано в viewDidAppear и т. д. ... просто чтобы проверить, можете ли вы настроить кнопку, которая вызывает метод, содержащий tf.becomeFirstResponder() --- таким образом мы можем исключить время как проблему   -  person Woodstock    schedule 18.08.2014
comment
Да, textField подключен как IBOutlet. Я попытался поместить tf.becomeFirstResponder() в func textFieldShouldBeginEditing(textField: UITextField!) -> Bool, где я в конечном итоге хочу быть, и позже, чем viewDidAppear, но получил исключение BAD Access Exception.   -  person blee908    schedule 18.08.2014
comment
Вы тестируете в симуляторе? Клавиатура не отображается в симуляторе в бета-версии 4 для меня. Однако запуск на устройстве показывает это.   -  person Eugene    schedule 18.08.2014
comment
Да, я запускаю симулятор, я пытаюсь запустить его на устройстве, но он говорит, что нет подготовленных устройств iOS с совместимой версией iOS... я только что обновился до последней версии iOS на своем iPhone 5.   -  person blee908    schedule 18.08.2014
comment
Проблема появляется только на Xcode 6 b5 с симулятором iPhone 4s. Этот код хорошо работает для симулятора iPhone 5s. Вы должны зарегистрировать радар.   -  person Imanou Petit    schedule 18.08.2014
comment
Примечание: вы не должны вызывать becomeFirstResponder() из textFieldShouldBeginEditing()   -  person Aaron Brager    schedule 18.08.2014
comment
@Юджин. Я думаю, вы правы, похоже, это проблема с самим симулятором xCode 6!!! Проклятый Apple.   -  person blee908    schedule 18.08.2014
comment
@bennett Похоже, что в любом случае есть довольно простой способ вызвать клавиатуру. Выберите текстовое поле, которое вы хотите отредактировать в симуляторе, и нажмите command+k   -  person Eugene    schedule 18.08.2014
comment
См. [этот вопрос] [1]. В основном нажмите Apple + K [1]: stackoverflow.com/questions/24420873/   -  person nflacco    schedule 19.08.2014
comment
Извините, это не сработало для вас, но ваш код отлично сработал для меня. +1   -  person stevenspiel    schedule 01.10.2014
comment
посмотрите на это [решение] [1], это поможет;) [1]: stackoverflow.com/questions/24420873/   -  person dimpiax    schedule 09.10.2014
comment
попробуй раньше canFirstResponder раньше станьFirstResponder.   -  person Vineesh TP    schedule 11.12.2014


Ответы (6)


Swift 4 у меня сработал
попробуй

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    
    textView.becomeFirstResponder()
    
}
person Methawin Intharakham    schedule 05.09.2018
comment
Выполнение из очереди отправки сделало это за меня. - person rodrigochousal; 15.01.2019
comment
viewDidAppear выполняется в основном потоке, т. е. требуется задержка, а не отправка в основной. Если вы уже находитесь в основном потоке, а затем отправляетесь в основной поток, то все, что вы только что отправили, попадет в конец основной очереди. Я полагаю: DispatchQueue.global(qos: .userInteractive).async{} также решит проблему из-за задержки, которую он создает. Представление должно иметь окно, прежде чем оно станет ответчиком, и это может произойти только после вызова viewWillAppear или viewDidAppear контроллера представления. Таким образом, любая попытка просмотреть ответчик до этого отменяется. - person Honey; 26.10.2019

Я только что проверил его с текстовым полем, вызвав функцию self.tf.becomeFirstResponder() indside viewDidLoad(), и она работает абсолютно нормально. Вам нужно будет переключить клавиатуру, нажав command + K, как только что указал nflacco, и отключить аппаратную клавиатуру в симуляторе следующим образом:

  1. Симулятор iOS -> Аппаратное обеспечение -> Клавиатура
  2. Снимите флажок «Подключить аппаратную клавиатуру».
person 4aRk Kn1gh7    schedule 01.01.2015

я думаю

class BLTestViewController: UIViewController, UITextFieldDelegate {

@IBOutlet var tf: UITextField

    override func viewDidLoad() {
        super.viewDidLoad()

        tf.delegate = self
        self.focustf()
        // Do any additional setup after loading the view.
    }

    func focustf(){
    self.tf.becomeFirstResponder()
    }
}
person Hoàng Kiên    schedule 11.12.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
comment
в моем случае мне нужно сосредоточиться на пользовательском текстовом поле раздела заголовка, когда пользователь щелкает строку раздела. Является ли это возможным? Я попытался сделать то же самое, выбрав строку в индексном пути, но у меня это не работает.! - person Hari Narayanan; 19.09.2018
comment
@HariNarayanan, можно попробовать сделать то же самое, что и выше, но с tableView (_ tableView: UITableView, представление willDisplayHeaderView: UIView, раздел forSection: Int) - person Derek Hierholzer; 08.11.2018

нажмите command+shift+k, чтобы открыть клавиатуру.

person Talha Ahmed    schedule 03.10.2019

попробуй с этим

 DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
                    textField.becomeFirstResponder()
                }

иногда неправильное время рендеринга вида

person x-rw    schedule 09.10.2019