我写了自己的Button,Textfield,...,类。在“自定义类”的故事板中,我将类设置为UIElement。这非常有效。
现在我需要一个以编程方式添加的工具栏。当我在ViewController中添加工具栏时,一切都很好。但我想创建我自己的工具栏类。
class MyOwnToolbar : UIToolbar {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
//never called
self.backgroundColor = UIColor.redColor()
self.tintColor = UIColor.greenColor()
self.barTintColor = UIColor.blueColor()
}
override init(frame: CGRect) {
//error: super.init isn'T called on all paths before returning from initiliazer
}
在我的ViewController中,我尝试这样调用:
fromToolBar = MyOwnToolBar() //call nothing?
fromToolBar = MyOwnToolBar(frame: CGRectMake(0,0,0,0)) //doesn't work because init(frame: CGRECT) doesnt work
我的ViewController中的旧代码有效:
self.untilToolBar = UIToolbar(frame: CGRectMake(0,0,0,0))
untilToolBar?.backgroundColor = redColor
untilToolBar?.tintColor = greenColor
untilToolBar?.barTintColor = blueColor
所以我可以使用我的工作解决方案,但是我想要解释为什么我的代码无效。所以也许有人有解决方案或良好的链接。
答案 0 :(得分:4)
如果您在界面构建器中添加它并将类连接到UI元素使用方法MyOwnToolbar
initWithCoder
如果您是以编程方式创建MyOwnToolbar
,则应使用init
或initWithFrame
。
示例:
class MyOwnToolbar: UIToolbar {
private func initialize() {
self.backgroundColor = UIColor.redColor()
self.tintColor = UIColor.greenColor()
self.barTintColor = UIColor.blueColor()
}
override init(frame: CGRect) {
super.init(frame: frame)
initialize()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
答案 1 :(得分:0)
Oleg说得对,如果你使用storyboard或xib创建你的视图控制器,那么init?(coder aDecoder: NSCoder)
将被调用。
但是您是以编程方式构建视图控制器,因此将调用init(frame: CGRect)
而不是init?(coder aDecoder: NSCoder)
。
你应该覆盖init(frame: CGRect)
:
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = UIColor.redColor()
self.tintColor = UIColor.greenColor()
self.barTintColor = UIColor.blueColor()
}