必需init?(编码器aDecoder:NSCoder)未调用

时间:2016-09-22 08:23:44

标签: swift init nscoder

我写了自己的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

所以我可以使用我的工作解决方案,但是我想要解释为什么我的代码无效。所以也许有人有解决方案或良好的链接。

2 个答案:

答案 0 :(得分:4)

如果您在界面构建器中添加它并将类连接到UI元素使用方法MyOwnToolbar

,那么您将如何创建自己initWithCoder

如果您是以编程方式创建MyOwnToolbar,则应使用initinitWithFrame

示例:

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