如何使用协议从UIView设置对象布局

时间:2016-06-10 15:41:10

标签: ios swift uiview uiviewcontroller swift-protocols

我尝试设置对象布局,其中使用协议引用UIView。我的视图类看起来像这样:

protocol FirstViewLayout {
   var label: String { get }
   var text: String { get }
}

class FirstView: UIView {

@IBOutlet weak var label: UILabel! // reference to object in storyboard
@IBOutlet weak var button: UIButton! // reference to object in storyboard

init(layout: FirstViewLayout){
       super.init(frame: UIScreen.mainScreen().bounds)
       label.text = layout.text
       button.setTitle(layout.text, forState: .Normal)
   }

   required init?(coder aDecoder: NSCoder) {
       super.init(coder: aDecoder)
   }
}//end class

然后我创建一个单独的swift文件,我在其中创建简单的struct并从视图

设置对象的值
struct FirstViewStruct: FirstViewLayout {

   var label: String { return "Test" }
   var text: String { return "TEST" }

}

然后我转到ViewControler并在viewDidLoad()中设置它:

override func viewDidLoad() {
    super.viewDidLoad()

    let layout = FirstView(layout: FirstViewStruct())
    self.view.addSubview(layout)

}

在这种情况下,我在这一刻收到了错误fatal error: unexpectedly found nil while unwrapping an Optional

label.text = layout.text

我不知道为什么。有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我认为你不能在struct中拥有默认值。

创建一个填充值的init:

convenience init() {
    self.label  = "test"
    self.text = "test"
    super.init()
}