gpt4 book ai didi

ios - 由于未实现的 init(frame :)),用 Swift 编写的 UIStackView 子类可能会崩溃

转载 作者:搜寻专家 更新时间:2023-11-01 06:06:19 25 4
gpt4 key购买 nike

我已经编写了一个 UIStackView 子类,但是我遇到了一个奇怪的运行时问题。这是一些可以看到的示例代码:

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")
}
}

如果你像这样使用它:

let stackView = SubclassedStackView(text: "Test", subtext: "Uh-oh!")

您收到运行时异常并显示以下消息:

fatal error: use of unimplemented initializer 'init(frame:)' for class 'test.SubclassedStackView'

查看调用堆栈显示基本初始化程序 -[UIStackView initWithArrangedSubviews:] 正试图在子类上调用 init(frame: CGRect),这是有意未实现。

当然我可以实现这个额外的初始化器,这很奇怪,因为它被父类(super class)调用,但在我的现实生活中,这会迫使我更改我的属性以使用可选类型(或隐式展开的可选类型) ) 我不应该这样做的地方。

我也可以调用 init(frame:) 而不是 init(arrangedSubviews:) 然后调用 addArrangedSubview(view:) 来添加安排的 subview 。运行时问题会消失,但我不想提供框架。

为什么父类(super class)的初始化器调用子类的初始化器?任何人都可以建议一种在不引入可选项的情况下解决此问题的方法吗?

编辑:Apple 承认了这个应该在 iOS 10 中修复的错误。http://www.openradar.me/radar?id=4989179939258368不幸的是,仍然适用于 iOS 8-9。

最佳答案

我不确定这是否能满足您的需求,但我已经设法通过 UIStackView 的扩展解决了这个问题:

extension UIStackView {
convenience init(text: String, subtext: String) {
let textlabel = UILabel()
let subtextLabel = UILabel()
textlabel.text = text
subtextLabel.text = subtext
self.init(arrangedSubviews: [textlabel, subtextLabel])
}
}

// ...

let sv = UIStackView(text: "", subtext: "") // <UIStackView: 0x7fcd32022c20; frame = (0 0; 0 0); layer = <CATransformLayer: 0x7fcd32030810>>

关于ios - 由于未实现的 init(frame :)),用 Swift 编写的 UIStackView 子类可能会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36502790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com