Я понял это ...
Я хочу начать с того, что решение НЕ входит в сферу применения вопроса, но я решил, что я должен опубликовать его в любом случае, так как оно может неосознанно влиять на другие элементы пользовательского интерфейса, которые, по-видимому, связаны с ним, тем самым непосредственно вызывая мою проблему.
Для начала в другом месте я определил расширение для UIView примерно так ...
extension UIView {
func doSomething() {
// Attempt to be sure that sublayers exist first...
if (self.layer.sublayers != nil) && (self.layer.sublayers.count > 0) {
self.layer.sublayers?.removeAll()
// These also cause crash
// self.layer.sublayers?.removeFirst()
// self.layer.sublayers?.forEach { $0.removeFromSuperlayer() }
// self.layer.sublayers = nil
}
// I insert a CALayer at index 0 with:
self.layer.insertSublayer(someCALayer, at: 0)
}
}
ПОЯСНЕНИЯ:
В какой-то момент я вручную добавляю CALayer к тому, что UIView вызывает эту расширенную функцию (не self.view UIViewController, а пользовательский UIView). У меня было требование, где мне нужно было заменить этот подслой на другой CALayer, в основном, с нуля. Поэтому я очистил текущий, если он был.
Так, например, представьте, что я определил другой UIView с именем someBlankUIView
. В этом UIView нет подпредставлений, но я вызываю эту функцию doSomething()
следующим образом: someBlankUIView.doSomething()
после добавления его в качестве подпредставления и ожидания вызова UIViewController viewDidLayoutSubviews()
.
Это НЕ приводит к сбою сразу и работает как задумано.
ОДНАКО следующие действия приведут к сбою:
- как только вы заставите клавиатуру появиться с becomFirstResponder()
- нажмите UITextField / UITextView
- вызвать функцию типа layoutIfNeeded()
, setNeedsLayout()
и т. д. для self.view
UIViewController
ИЗВЕСТНЫЕ АВАРИИ:
Если оставить это удаление всех подслоев, следующее приведет к множеству сбоев. Примеры включают в себя:
EXC_BAD_ACCESS
NSArrayI позиция
om_wf isHidden
__NSCFString isHidden
-__ NSOrderedSetM isHidden:
Следует отметить, что некоторые из них имеют одно и то же ключевое слово isHidden
, но в то же время эти ошибки отображаются на первый взгляд случайным образом, так как код не меняется между сбоями, а другая причина отображается в журнале.
РЕШЕНИЕ:
Просто никогда не удаляете слой из подслоев? Даже если вы вручную вставили один. Это звучит несколько необычно и, возможно, требует дополнительных исследований, возможно.
Но опять же, как я уже сказал, это решение может выходить за рамки первоначального вопроса, но я подумал, что должен опубликовать его, поскольку оно напрямую вызывает сбой.
ДОПОЛНИТЕЛЬНЫЕ ЗАМЕЧАНИЯ:
Также, чтобы уточнить, это, скорее всего, не имеет ничего общего с обновлением Xcode 9.3.1. Из опыта обновления всегда что-то ломается для меня, и на этот раз я предположил, что это было снова, так как я обновил сразу после добавления этой единственной строки кода. (Мне пришлось обновить Xcode, так как я обновил свой iPhone, что вызвало проблемы совместимости с моей текущей версией Xcode). Надеюсь, я был достаточно наглядным.