«Неожиданно найденный ноль при неявном развертывании необязательного значения» в переопределенной инициализации в пользовательском классе UIView - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь создать простой повторно используемый компонент (фактически полностью пустой, просто цвет фона, чтобы отличить его), но когда я пытаюсь использовать декоратор IBDesignable, чтобы сделать его отображаемым в редакторе XCode Interface Builder, он дает мнеошибка:

Failed to render and update auto layout status for AnnounceVC: The agent crashed.

Кажется, эта ошибка исходит от моего компонента XIB и его быстрого класса.

Вот мой код класса AnnounceBubbleView:

import UIKit
@IBDesignable class AnnounceBubbleView: UIView {
    @IBOutlet var contentView: UIView!

    override init(frame: CGRect) {
        super.init(frame: frame)
        addSubview(contentView)
    }

    required init(coder: NSCoder) {
        super.init(coder: coder)!
    }
}

Когда яперейдите в папку DiagnosticReports, и я нахожу мой сбой, он дает мне это:

Sleep/Wake UUID:       F0240558-7F85-40FC-ADCC-7E95493F1BAA

Time Awake Since Boot: 2700 seconds
Time Since Wake:       2300 seconds

System Integrity Protection: enabled

Crashed Thread:        0

Exception Type:        EXC_BAD_INSTRUCTION (SIGILL)
Exception Codes:       0x0000000000000001, 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

Termination Signal:    Illegal instruction: 4
Termination Reason:    Namespace SIGNAL, Code 0x4
Terminating Process:   exc handler [3224]

Application Specific Information:
CoreSimulator 587.35 - Device: iPhone 8 (07FC5929-A66D-4560-8FBE-39DF290CD7EB) - Runtime: iOS 12.2 (16E226) - DeviceType: iPhone 8
Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

Я пытался использовать

required init?(coder: NSCoder) {
    super.init(coder: coder)
}

Но это дает мне ту же ошибку, и XCode выигралне создайте, если я не добавлю значение Optional или Forced.

EDIT

В случае, когда я удаляю часть «addSubview», тогда UIViewне мой пользовательский вид, ни на IB, ни в эмуляторе iOS.Это пустой пустой UIView

код:

override init(frame: CGRect) {
    super.init(frame: frame)
}

override required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

РЕДАКТИРОВАТЬ 2

Я не запускаю его программно, я хотел бы иметь возможностьчтобы просмотреть его в раскадровке.

У вас есть идеи?

Не стесняйтесь помочь мне улучшить мой пост, если он недостаточно ясен, я новичок в Swift и XCode.

1 Ответ

0 голосов
/ 04 июля 2019

Во время инициализации contentView еще не был инициализирован, и поэтому он равен нулю, пытаясь выполнить

addSubview(contentView)

, действительно, в результате сбоя он попытается принудительно развернуть нулевое значение

если ваше представление необходимо создать из файла раскадровки / пера, вам не нужно добавлять подпредставление в первую очередь

если вы создаете его экземпляром программным способом, вам нужно сначала создать экземпляр contentView, прежде чем пытаться вызвать addSubview.

...