2016-02-19 17 views
7
class CustomView: UIView { 

    var subViewColor:UIColor 
    var subViewMessage:String 

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

    init(subViewColor:UIColor,subViewMessage:String){ 

     self.subViewColor = subViewColor 
     self.subViewMessage = subViewMessage 
     super.init() 

    } 

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

} 

Tôi có một lớp học nơi tôi muốn người dùng để khởi tạo một giao diện tùy chỉnh bằng cách đưa ra các thuộc tính như:Override của UIView trong nhanh chóng

let myView = CustomLoadingView(initialize properties here) 

Nếu người dùng không muốn khởi tạo riêng của họ tài sản, tôi muốn khởi CustomLoadingView sử dụng thuộc tính mặc định ...

let myView = CustomLoadingView() // this should initialize using default value 

Tuy nhiên, với điều này, tôi nhận được lỗi này:

Must call a designated intializer of the superclass UIView

Trả lời

26

Trong init(subviewColor: UIColor, subViewMessage: String), bạn không gọi trình khởi tạo được chỉ định (như trình biên dịch chỉ ra độc đáo).

Nếu bạn không biết người khởi tạo được chỉ định là gì, họ là người khởi tạo mà để được gọi bởi lớp con tại một số điểm. Từ các tài liệu:

Designated initializers are the primary initializers for a class. A designated initializer fully initializes all properties introduced by that class and calls an appropriate superclass initializer to continue the initialization process up the superclass chain.

Trong trường hợp này, khởi tạo dành riêng cho UIViewinit(frame: CGRect), có nghĩa là tại một số điểm, khởi tạo mới của bạn init(subviewColor: UIColor, subViewMessage: String phải gọi super.init(frame:).

Để sửa lỗi này, làm cho các thay đổi sau:

init(frame: CGRect, subViewColor: UIColor, subViewMessage: String){ 

    self.subViewColor = subViewColor 
    self.subViewMessage = subViewMessage 
    super.init(frame: frame) 

} 

HOẶC bạn có thể gọi initializer khác của bạn trong lớp học của bạn sẽ kết thúc lên kêu gọi initializer được chỉ định.

override init(frame: CGRect) { 
    super.init(frame: frame) // calls designated initializer 
} 

convenience init(frame: CGRect, subViewColor: UIColor, subViewMessage: String){ 

    self.subViewColor = subViewColor 
    self.subViewMessage = subViewMessage 
    self.init(frame: frame) // calls the initializer above 

} 

Đối với phương thức tiện lợi đơn giản là CustomLoadingView(), bạn phải thêm bộ khởi tạo khác cho điều đó. Thêm mã này để xem tùy chỉnh của bạn:

convenience init() { 
    self.init(frame: DEFAULT_FRAME, subViewColor: DEFAULT_COLOR, subViewMessage: DEFAULT_MESSAGE) 
} 

Nếu bạn muốn tìm hiểu thêm về initializers định và thuận tiện, đọc về họ herehere.

+0

Điều này chỉ hoạt động đối với tôi nếu tôi gọi 'self.init (frame: frame)' là điều đầu tiên trong 'tiện ích init' phương pháp – Joseph

4

Hãy thử điều này:

class CustomView: UIView { 

    var subViewColor:UIColor 
    var subViewMessage:String 

    init(subViewColor:UIColor,subViewMessage:String){ 

     self.subViewColor = subViewColor 
     self.subViewMessage = subViewMessage 

     let frame = self.frame 
     //Or you can use custom frame. 

     super.init(frame: frame) 

    } 

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

Tạo lỗi trình biên dịch: _ của chính mình 'được sử dụng trước cuộc gọi super.init_. [Xem câu trả lời này.] (Https://stackoverflow.com/a/33765813/629407) – dxb

0

Bạn phải gọi một trong initializers định UIView tại một số điểm trong initializer tùy chỉnh của bạn, ví dụ: super.init(frame: frameX). Cuộc gọi của bạn super.init() không đáp ứng yêu cầu này.

Các vấn đề liên quan