1

练习 MVC 模式并希望使用故事板将视图与视图控制器分开。

在 main.storyboard 我有一个视图控制器,并且在 rootview 中有一些 uilabels。

为了将视图代码与视图控制器分开,我从视图控制器场景中选择了视图,创建了 FruitDetailView 类并将其子类化到故事板身份检查器中。

在此处输入图像描述

在此处输入图像描述

并将 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)
    }

}

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

在此处输入图像描述

我怎样才能解决这个问题?

4

1 回答 1

3

您的问题是您希望在创建其属性之前访问您创建的 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"
}
于 2020-10-26T05:18:10.200 回答