如何使用情节提要Swift将视图与ViewController分开?

时间:2020-10-26 04:38:05

标签: swift uiview subclass loadview

正在练习MVC模式,并希望使用情节提要将视图与ViewController分开。

在main.storyboard中,我有一个ViewController,并且rootview中有一些uilabel。

为了将视图代码与viewcontroller分开,我从viewcontroller场景中选择了视图,创建了FruitDetailView类并将其在情节提要(Istoryboard)身份检查器中子类化。

enter image description here

enter image description here

并将UILabels连接到FruitDetailView类。

class FruitDetailView: UIView {

    @IBOutlet weak var name: UILabel!
    @IBOutlet weak var type: UILabel!

    override init(frame: CGRect) {
        super.init(frame: frame)
        name.text = ""
        type.text = ""
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func update(_ detail: Fruit) {
        name.text = detail.name
        type.text = detail.type
    }
    
}

在viewController中,创建了FruitDetailView()实例。 并在loadview()方法中,分配了fruitDetailView实例以查看属性。

class FruitDetailViewController: UIViewController {
    
    private let fruitDetailView = FruitDetailViewController()
    var fruit = Fruit()
    
    override func loadView() {
        view = fruitDetailView
        fruitDetailView.update(fruit)
    }

}

但是当我运行该应用程序时,该应用程序崩溃并出现错误。

enter image description here

我该如何解决?

1 个答案:

答案 0 :(得分:0)

您的问题是,您想要在创建它的FruitDetail类之前就创建它的属性。将断点放在name.text = ""上并运行,您将明白我的意思。要解决此问题,只需安全地控制nil值即可:

if let label = name { // by the way consider in future to assign values like nameLabel rather than name
    name.text = "put your string value"
}