2016-09-22 13 views
2

私は自分のButton、Textfield、...、クラスを作成しました。 "カスタムクラス"のストーリーボードで、クラスをUIElementに設定しました。これは非常にうまくいく。必要なinit(コーダーaDecoder:NSCoder)が呼び出されていません

これで、プログラムで追加されたツールバーが必要になりました。私のViewControllerでツールバーを追加すると、すべてが問題ありません。しかし、私はこのように私自身のツールバークラスを作成したい。私の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 
} 

私はこのような呼び出そう:

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を作成している場合、あなたはinitかを使用する必要があるUI要素の使用方法にinitWithCoder

をクラスを接続する場合は、MyOwnToolbarだ作成するにはどうすればよいによってれます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() 
} 
関連する問題