【问题标题】:How to separate view from viewcontroller using storyboard swift?如何使用情节提要迅速将视图与视图控制器分开?
【发布时间】:2020-10-26 04:38:05
【问题描述】:

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

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

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

并将 UILabel 连接到 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)
    }

}

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

我该如何解决这个问题?

【问题讨论】:

  • 在 awakeFromNib() 而不是 init(frame:) 中初始化 name.text 和 type.text
  • @RobertCrabtree 如果我在 awakeFromNib() 中初始化这些属性,则没有错误。但它只显示黑色视图,我看不到任何标签。
  • 这听起来像是一个完全不同的问题。你有没有限制你的标签?如果更改视图的背景颜色会怎样?
  • 我在情节提要中设置了 uilabel 的约束。如果我将背景颜色更改为白色,我只会看到白色视图。
  • 您确定您的文本字段中的文本不是空字符串

标签: swift uiview subclass loadview


【解决方案1】:

您的问题是您希望在创建其属性之前访问您创建的 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"
}

【讨论】:

    猜你喜欢
    • 2013-10-21
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2017-07-08
    • 2018-07-16
    相关资源
    最近更新 更多