2016-11-26 16 views
1

親UIViewクラスにサブクラスを追加できません。私はBOOKクラスを構築しようとしており、さまざまなUIViewとUIImageViewクラスを使って、カバーとページを構築しようとしています。 SELFにサブクラスを追加するときにエラーが発生します。いくつかの洞察力が大好きです。 PS - 総迅速noobのSwiftのUIViewにサブクラスを追加する

//book 
class bookview : UIView { 

    var cover: UIView! 
    var backcover: UIView! 
    var page: UIImageView! 

    init (pages: Int) { 

     //backcover cover 
     backcover = UIView(frame: CGRect(x: 200, y: 200, width: bookwidth, height: bookheight)) 
     backcover.backgroundColor = UIColor.blue 
     self.addSubview(backcover) //ERROR HERE 

     //pages 
     for i in 0 ..< pages { 

      page = UIImageView(frame: CGRect(x: bookwidth * i/10, y: bookheight * i/10, width: bookwidth, height: bookheight)) 
      page.backgroundColor = UIColor.red 
      self.addSubview(page) //ERROR HERE 

     } 

     //front cover 
     cover = UIView(frame: CGRect(x: 0, y: 0, width: bookwidth, height: bookheight)) 
     cover.backgroundColor = UIColor.blue 
     self.addSubview(cover) //ERROR HERE 

     super.init(frame: CGRect(x: 0, y: 0, width: bookwidth, height: bookheight)) 


    } 

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

} 


//add book 
let book = bookview(pages: 3) 
+0

self.addSubview()を呼び出す任意の時間の前にあることを

super.init(frame: CGRect(x: 0, y: 0, width: bookwidth, height: bookheight)) 

を?私はここでXcodeはかなり明確だと思います。 – vacawama

+0

自己が初期化されていない 'super.init(フレーム:CGRect(x:0、y:0、width:bookwidth、height:bookheight))'がinitの最初の行に移動する – Cruz

答えて

2

selfが呼び出されるまで、イニシャライザのselfのメソッドを呼び出すことができないという問題があります。スーパークラスイニシャライザを呼び出すまで、selfの値は確立されていません。言い換えれば、UIViewのサブクラスがまだUIViewとしてまだ初期化されていないときに、どのように "addSubview"を知っていますか?

だから、あなたのコード例では、単に行に移動:あなたは、エラーが何と言ってい

2

addSubview()UIView上の方法です。 UIViewはあなたのビューのスーパークラスです。完全に初期化されるまで、スーパークラスのメソッドを呼び出すことはできません。

この問題を解決するには、先にファンクションで(addSubview()に電話する前に)super.init(frame:)に電話してください。

関連する問題