Бета-версия Xcode8, добавляющая self.view.layoutIfNeeded() в геттер inputAccessoryView, вызывающая сбой

Используя бета-версию Xcode8, мой симулятор падает при использовании inputAccessoryView и добавлении строки self.view.layoutIfNeeded() в геттере переопределения inputAccessoryView. Он отлично работает на моих устройствах, но эта одна строка приводит к сбою симулятора каждый раз.

override var inputAccessoryView: UIView? {
    get {
        self.view.layoutIfNeeded()
        return customToolbar
    }
}

В консоли отображается следующее сообщение:

libc++abi.dylib: terminating with uncaught exception of type NSException

Если я просто удалю строку: self.view.layoutIfNeeded(), она будет нормально работать на симуляторе. Мне нужна эта строка, иначе collectionView на мгновение отскакивает, когда вызывается уведомление об изменении клавиатуры inputAccessoryView.


person alionthego    schedule 17.06.2016    source источник


Ответы (1)


Вы, вероятно, попадаете в новые циклы макета. См. изменения в API iOS 10 здесь https://developer.apple.com/library/content/releasenotes/General/RN-iOSSDK-10.0/

Сторонние приложения с настраиваемыми подклассами UIView, использующими Auto Layout, которые переопределяют layoutSubviews и грязный макет для себя перед вызовом super, рискуют вызвать цикл обратной связи макета при перестроении в iOS 10. Когда они правильно отправляют последующие вызовы layoutSubviews, они должны обязательно в какой-то момент перестаньте загрязнять макет на себе (обратите внимание, что этот вызов был пропущен в выпуске до iOS 10).

person Roman Truba    schedule 18.09.2016