2016-09-22 6 views
2

Я написал свою собственную Button, Textfield, ..., classes. В раскадровке в «Custom Class» я установил класс в UIElement. Это работает очень хорошо.Требуется init? (Coder aDecoder: NSCoder) не называется

Теперь мне нужна панель инструментов, которая добавлена ​​программно. Когда я добавляю панель инструментов в свой 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

Вам нужно настроить его внутри метода awakeFromNib –

+0

http://stackoverflow.com/a/29783546/2303865 –

ответ

4

Это зависит, как вы создаете вы 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") 
    } 
} 
0

Олег получил это право, если вы используете раскадровку или XIB, чтобы создать контроллер представления, то init?(coder aDecoder: NSCoder) будет называться.

Но вы программно создаете свой контроллер вида, поэтому вместо init?(coder aDecoder: NSCoder) будет вызываться init(frame: CGRect).

вы должны переопределить init(frame: CGRect):

override init(frame: CGRect) { 
    super.init(frame: frame) 
    self.backgroundColor = UIColor.redColor() 
    self.tintColor = UIColor.greenColor() 
    self.barTintColor = UIColor.blueColor() 
} 
Смежные вопросы