2016-07-01 6 views
0

다음 코드로 사용자 지정 UIButton을 만듭니다. 이 UIButton 프로그래밍 방식으로 추가하고 싶습니다. 내가 그렇게하려고 할 때 IOS가 추락했습니다. 그것은 InterfaceBuilder에서 잘 작동합니다.사용자 지정 UIButton 추가 프로그래밍 방식으로 치명적인 오류

Xcode이 오류를 알려주십시오.

fatal error: init(coder:) has not been implemented:

수정하려면 어떻게해야합니까? 어떤 제안이라도 정말로 감사 할 것입니다.

다음은 Round UIButton에 사용하는 코드입니다. 그것은 나를라면

import UIKit 

    @IBDesignable 
    class RoundButton: UIButton { 

     override init(frame: CGRect) { 
      super.init(frame: frame) 
      setupView() 
     } 

     required init?(coder aDecoder: NSCoder) { 
      fatalError("init(coder:) has not been implemented") 
     } 

     initWithCoder 
     override func awakeFromNib() { 
      setupView() 
     } 

     override func prepareForInterfaceBuilder() { 
      super.prepareForInterfaceBuilder() 
      setupView() 
     } 

     func setupView() { 
      let radius = self.frame.size.height/2 
      layer.cornerRadius = radius 
     } 

    } 
+3

당신은 당신의'초기화하기 (코더)의'fatalError'을 가지고 : 그것은 항상 당신이 그것을 구현해야 init(coder:) 호출합니다. Swift는 그 일을 수행하고 있습니다. –

+0

"init?"안에 무엇을 넣어야합니까? ? – Geeroz

+0

... 오류가 발생하지 않는 것이 있습니까? –

답변

1

, 나는 전부 초기화를 피할 것 : 그런

import UIKit 

@IBDesignable 
class RoundButton: UIButton { 

    override func awakeFromNib() { 
     setupView() 
    } 

    override func prepareForInterfaceBuilder() { 
     super.prepareForInterfaceBuilder() 
     setupView() 
    } 

    func setupView() { 
     let radius = self.frame.size.height/2 
     layer.cornerRadius = radius 
    } 
} 

뭔가가 작동합니다. setupViewawakeFromNib에서 호출하므로 이니셜 라이저 내부에서 호출 할 필요가 없다고 생각합니다.

이 같은 간단한이 작동 한 후 init(coder:)의 자신의 버전을 작성해야 할 이유가있는 경우 :

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    setupView() 
} 
+0

당신이 제안한대로 이니셜 라이저를 제거하려고하지만 단추가 둥근 대우를받지 못합니다. 초기화 (코더 :)를 시도 할 것입니다. – Geeroz

+0

내 편집도 확인하십시오. 'init (coder :)'를'setupView'에 대한 호출을 포함하도록 변경했습니다. 나는 그것을 처음에 넣는 것을 잊었다. 잘하면 그것이 작동합니다. –

+0

감사합니다. 'setupView()'없이'required init (코더 aDecoder : NSCoder)'안에'super.init (coder : aDecoder)'를 추가하여 작동하도록했습니다. 여전히'init 초기화 (프레임 : CGRect)'가 필요합니다. 게다가. – Geeroz

1

인터페이스 빌더는 스토리 보드를 직렬화하고 앱 실행 압축을 풀고는. `:

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 

    // If your subclass has extra properties, initialize them here... 
    self.property1 = aDecoder.decodeIntegerForKey("property1") 
    self.property2 = aDecoder.decoddeObjectForKey("property2") as! String 
} 
+0

감사합니다. 시험해 보겠습니다. – Geeroz

관련 문제