Ich habe eine UIStackView
Unterklasse geschrieben, aber ich habe ein seltsames Laufzeitproblem. Hier ist ein Beispielcode, wo es zu sehen ist:UIStackView-Unterklassen, die in Swift geschrieben wurden, können aufgrund nicht implementierter init (frame :) abstürzen
class SubclassedStackView: UIStackView {
init(text: String, subtext: String) {
let textlabel = UILabel()
let subtextLabel = UILabel()
textlabel.text = text
subtextLabel.text = subtext
super.init(arrangedSubviews: [textlabel, subtextLabel])
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Wenn Sie dann verwenden, wie dies:
let stackView = SubclassedStackView(text: "Test", subtext: "Uh-oh!")
Sie erhalten eine Laufzeitausnahme mit der folgenden Meldung:
fatal error: use of unimplemented initializer 'init(frame:)' for class 'test.SubclassedStackView'
Ein Blick auf die Aufrufliste zeigt, dass der Basisinitialisierer -[UIStackView initWithArrangedSubviews:]
versucht, init(frame: CGRect)
für die Unterklasse aufzurufen, die absichtlich nicht implementiert ist.
Natürlich könnte ich diesen zusätzlichen Initialisierer implementieren, so merkwürdig es wäre, von der Oberklasse aufgerufen zu werden, aber in meinem realen Fall würde dies mich zwingen, meine Eigenschaften zu ändern, um optionale Typen zu verwenden (oder implizit ausgepackt) optionals) wo ich das nicht machen sollte.
Ich könnte auch init(frame:)
anstelle von init(arrangedSubviews:)
anrufen und anschließend addArrangedSubview(view:)
anrufen, um die angeordneten Unteransichten hinzuzufügen. Das Laufzeitproblem würde verschwinden, aber ich möchte keinen Frame bereitstellen.
Warum ruft der Initialisierer der Oberklasse den Initialisierer der Unterklasse auf? Kann jemand einen Weg vorschlagen, um dieses Problem zu umgehen, ohne Optionals einzuführen?
Edit: Apple bestätigte diesen Fehler, der in iOS 10 behoben werden sollte. http://www.openradar.me/radar?id=4989179939258368 gilt immer noch für iOS 8-9 leider.
Das ist ähnlich zu diesem Problem (behoben in iOS9) mit UITableViewController-Unterklassen: http://stackoverflow.com/questions/25139494/how-to -subclass-uitableviewcontroller-in-swift/30719434? s = 2 | 0.1651 # 30719434 – Clafou
Der obige Code kompiliert nicht mehr in iOS 10: Muss einen designierten Initialisierer der Oberklasse 'UIStackView' aufrufen –