inputAccessoryView исчезает после представления UIViewController

У меня есть UICollectionViewController с inputAccessoryView. Все работает отлично, пока я не представлю UIViewController, а затем вспомогательное представление исчезнет. Пытаюсь получить базовые функции приложения Chat.

Я реализовал в представлении коллекции:

override var inputAccessoryView: UIView? {
    get {
        return inputContainerView
    }
}

override var canBecomeFirstResponder: Bool {
    return true
}

override func becomeFirstResponder() -> Bool {
    return true
}

Как было предложено в нескольких других потоках, я также вызываю (в представлении коллекции),

view.resignFirstResponder()
view.inputAccessoryView?.reloadInputViews()
view.becomeFirstResponder()

после увольнения UIViewController, но безрезультатно. print (view.isFirstResponder) по-прежнему печатает false. Я пробовал почти все комбинации трех вышеперечисленных строк в разных местах своего кода. Думаю, мне не хватает чего-то простого.


person Sanzio Angeli    schedule 04.06.2017    source источник
comment
интересно. Я думал, что только textFields и textViews имеют inputAccessoryView ... в любом случае: я думаю, что для inputAccessoryView на экране представление, которому он принадлежит, должно быть текущим респондентом ... но поскольку вы представили viewControlle ... это было подал в отставку, и теперь вам нужно, чтобы его представление снова стало firstResponder ... Я предполагаю, что быстрым решением было бы поместить view.becomeFirstResponder() в ваш viewDidAppear, который гарантирует, что inputAccessoryView будет там каждый раз, когда вы подходите к экрану.   -  person Honey    schedule 04.06.2017
comment
Я узнал здесь, переходите к 15:00, если вам действительно интересно: youtube.com/watch?v = ky7YRh01by8 Спасибо за предложение!   -  person Sanzio Angeli    schedule 05.06.2017
comment
Сработало ли мое предложение ?!   -  person Honey    schedule 05.06.2017
comment
К сожалению, этого не произошло .... по какой-то причине, когда я вызываю статьFirstResponder, он никогда не работает   -  person Sanzio Angeli    schedule 05.06.2017
comment
Обновление: небольшая модификация вашего предложения сработала ... Я использовал viewDidAppear (который я никогда не использовал) для представления loginController, и это сработало. Мне никогда не приходилось вызывать view.becomeFirstResponder(). Мой метод таймера, приведенный ниже, по сути, выполнял то же самое, но это гораздо менее хакерский и профессиональный. Очень признателен. я запомню это   -  person Sanzio Angeli    schedule 05.06.2017
comment
Какая модификация? Я упомянул _1 _... что вы изменили?   -  person Honey    schedule 05.06.2017
comment
Вместо того, чтобы представлять контроллер представления в viewDidLoad, я представил его в предложенном вами viewDidAppear. Когда этот контроллер представления был представлен от viewDidLoad, он, казалось, навсегда удалил свойство первого респондента. Вызов view.becomeFirstResponder в одиночку в viewDidAppear почему-то не работал.   -  person Sanzio Angeli    schedule 05.06.2017


Ответы (2)


Анимация для представления и отклонения контроллера представления может вызывать проблему или вы не поддерживали глобальный ivar для представления, которое вы установили в качестве вспомогательного представления ввода. Попробуйте создать ivar только для чтения для accessoryview, чтобы только один экземпляр выделялся и поддерживался в течение всего жизненного цикла VC. Затем убедитесь, что вы вернули его в текстовые поля перед вызовом reloadInputViews.

person RamaKrishna Chunduri    schedule 04.06.2017
comment
Спасибо за ответ! Я проголосовал, но у меня меньше 15 респондентов - person Sanzio Angeli; 05.06.2017

Через несколько дней я наконец понял, что работает ... Думаю, я пытался представить loginController до того, как collectionView был установлен в качестве первого респондента. Вместо того, чтобы просто вызвать present, я вызвал эту функцию:

func presentLoginControllerAfterImFirstResponder(fromUser: Bool) {
    // Starts a timer
    Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { (timer) in
        // Is this view the first responder?
        if self.isFirstResponder {
            // Creates the loginController
            let loginController = LoginController()
            // Presents it
            self.present(loginController, animated: fromUser, completion: {
                // Once presented, sets rootViewController = self
                loginController.rootViewController = self
            })
            // Stop the timer
            timer.invalidate()
        }
    }
}

Теперь это работает. Я предполагаю, что collectionView потребовалось некоторое время, чтобы стать первым респондентом? Я могу представить и отклонить loginController без проблем, а inputAccessoryView останется.

person Sanzio Angeli    schedule 04.06.2017