2016-09-22 8 views
2

Button, Textfield, ..., 클래스를 작성했습니다. "사용자 정의 클래스"의 스토리 보드에서 클래스를 UIElement로 설정했습니다. 이것은 아주 잘 작동합니다.필요한 초기화? (코더 디자이너 : 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 
} 

I는 다음과 같이 호출 할 :

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

그것은 따라되는 방법 당신은 당신이 initWithCoder

당신이 프로그래밍 방식 MyOwnToolbar를 만드는 경우, 당신은 init를 사용하거나해야 인터페이스 빌더에서 이것을 추가하고 UI 요소의 사용 방법에 클래스를 연결하는 경우 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) :

override init(frame: CGRect) { 
    super.init(frame: frame) 
    self.backgroundColor = UIColor.redColor() 
    self.tintColor = UIColor.greenColor() 
    self.barTintColor = UIColor.blueColor() 
}