2016-11-26 4 views
1

Я не могу добавить подкласс в родительский класс UIView. Я пытаюсь создать класс BOOK и иметь различные классы UIView и UIImageView для создания обложек и страниц. Я получаю сообщение об ошибке при добавлении подкласса к SELF. Полюбило бы некоторое понимание. PS - общая быстрое нубДобавление подклассов в UIView в Swift

//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

Что говорит ошибка? Я думаю, что Xcode здесь довольно понятен. – vacawama

+0

self не инициализирован move 'super.init (frame: CGRect (x: 0, y: 0, width: bookwidth, height: bookheight))' to firstline init – Cruz

ответ

2

Проблема заключается в том, что вы не можете вызывать методы на self в инициализаторе до тех пор, пока их не назовете self. Устанавливается значение self, пока вы не вызвали инициализатор суперкласса. Другими словами, как подкласс UIView знает, как «addSubview», когда он еще не был инициализирован как UIView?

Таким образом, в вашем примере кода, просто переместить строку:

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

быть до того, как раз, когда вы звоните self.addSubview()

2

addSubview() представляет собой метод на UIView. UIView - суперкласс вашего взгляда. Вы не можете вызывать методы на суперклассе, пока он не будет полностью инициализирован.

Чтобы исправить это, позвоните по телефону super.init(frame:) раньше в вашей собственной функции init() (перед тем как позвонить по телефону addSubview()).