试图给UIButton一个特殊的属性



我需要UIButton拥有属性bookId。我尝试了以下代码,但它给了我错误Property 'self.bookId' not initialized at super.init call.我需要该属性能够在单击按钮时查询数据库中该特定 bookId。

import UIKit
class BookUIButton: UIButton {
var bookId: String
init(frame: CGRect, bookId: String) {
super.init(frame: frame);
self.bookId = bookId
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(frame: CGRect) {
super.init(frame: frame)
}
override func awakeFromNib() {
super.awakeFromNib()
//TODO: Code for our button
}
}

任何帮助将不胜感激!!

swift强制你在使用之前初始化每个成员 var。由于它无法确定当它超级轮到时会发生什么,所以它出错了:安全总比后悔好!

解决方案 1:

class BookUIButton: UIButton {
var bookId: String?
init(frame: CGRect, bookId: String) {
super.init(frame: frame);
self.bookId = bookId
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(frame: CGRect) {
super.init(frame: frame)
}
override func awakeFromNib() {
super.awakeFromNib()
//TODO: Code for our button
}
}

解决方案 2: 有更好的方法可以跳过此错误。所以你所要做的就是在声明后初始化成员:

class BookUIButton: UIButton {
var bookId: String = String()
init(frame: CGRect, bookId: String) {
super.init(frame: frame);
self.bookId = bookId
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(frame: CGRect) {
super.init(frame: frame)
}
override func awakeFromNib() {
super.awakeFromNib()
//TODO: Code for our button
}
}

将其命名为 bookId 重要吗?成为一根绳子重要吗? 如果你只是给UIButton一个标签呢?(例如ButtonName.tag = Int(

由于您始终可以从情节提要实例化按钮,因此该按钮需要具有所需的 init?(coder aDecoder: NSCoder(。只有在情节提要中插入按钮时才需要该方法。 如果按钮实际上是通过情节提要创建的,那么它当然不会很快(在初始化时(拥有 id,以至于它不是可选的。

由于我假设您将始终以编程方式实例化按钮,而不是通过故事板,因此您可以使用参数实现自己的 init,然后在所需的 init 中插入一个 fatalError。

这将编译为致命错误返回 Ever(意味着它永远不会返回(,因此编译器可以理解 bookId 实际上永远不会为零。

实际上,如果您删除所需的init Xcode会建议您插入带有fatalError的方法,并根据需要自动完成它。

当然,在那之后,如果你在情节提要中放置这个类的按钮,它会崩溃,所以不要这样做。

通常,如果您不打算将该按钮(或视图(使用情节提要,则向按钮(或一般视图(添加属性并强制通过某些 init 而不是通过情节提要创建该属性是完全可以的。

PS:在简要介绍了如何做你想做的事情之后,我想建议你在这种情况下不要这样做,因为按钮保存有关您需要调用的某些 API 的任何数据似乎是一个坏主意。该按钮应该只是一个按钮,并在用户点击它时通知您。然后,当按下按钮时,其他一些类应该处理要做什么,使用其他模型来获取该按钮点击的相应 bookId。

完全不同的是,如果您添加一些有助于按钮看起来不同的属性,或者添加一些特定于按钮使用的其他行为(这只是可点击并通知点击(

最新更新