Ответ 1
iOS8 имеет цикл сохранения с inputAccessoryView. Здесь хороший пост, который, кажется, имеет хороший обход:
http://derpturkey.com/uitextfield-docked-like-ios-messenger/
Я хочу сделать такое поведение, как приложение для обмена сообщениями. Я просматривал Qaru для решений для этого, и действительно есть много:
Выход из входного окна Просмотр видимости после отклонения клавиатуры
Это я нашел. Но, похоже, в iOS8
ситуация немного отличается. Если я делаю то же самое в новом iOS8 sdk
, я получаю ошибку:
'UIViewControllerHierarchyInconsistency', reason: 'child view controller:<UICompatibilityInputViewController: 0x7fdcb3441b10> should have parent view controller:<ViewController: 0x7fdcb3b1e9f0> but requested parent is:<UIInputWindowController: 0x7fdcb684c000>'
Чтобы проверить это, я сделал пример проекта, только один контроллер с представлением внизу:
Выход подключен к виду снизу, на котором есть только UITextField
. Я что-то упускаю и как мне получить желаемое поведение?
iOS8 имеет цикл сохранения с inputAccessoryView. Здесь хороший пост, который, кажется, имеет хороший обход:
http://derpturkey.com/uitextfield-docked-like-ios-messenger/
Вы добавляете someView
к нескольким супервирусам, что приводит к несогласованным иерархиям (что он говорит вам).
Когда клавиатура активируется, она вызывает метод inputAccessoryView()
, чтобы увидеть, нужно ли ей что-либо наклеить на клавиатуре и добавляет ее в свой собственный superView. Но вы уже добавили его в представление через свою раскадровку.
Теперь есть два способа решить эту проблему:
Сделайте .xib
с вашим представлением и верните его в свой inputAccessoryView()
, не добавляя его в какой-либо супервизор (клавиатура будет.
Или сделайте это полностью с помощью NSLayoutConstraint
.
Вы можете добавить следующий код в свой ViewController, который будет сохраняться, даже если клавиатура скрыта.
override func canBecomeFirstResponder() -> Bool {
return true
}
Посмотрите этот репозиторий GitHub для примера.