首页 > 解决方案 > UIKit:如何创建一个基础的、重用的 XIB 文件并在其中添加不同的内容?

问题描述

首先,一些基本信息:我的项目使用 UIKit,带有 XIB 文件(没有 Storyboard)。

对于给定的视图控制器,比如说MyTestViewController.swift,我有一个关联MyTestViewController.xib文件。这就是我初始化视图控制器的方式:

public init() {
    super.init(nibName: "MyTestViewController", bundle: .main)
}

required public init?(coder: NSCoder) {
    fatalError()
}

现在这是我的问题:我有一个Item协议,其中包含许多符合它的结构:

protocol Item {
    var headerElements: [String]
}

struct Pen: Item {
    var headerElements: [String]

    var inkColor: UIColor
    var inkAmount: CGFloat    
}

struct Key: Item {
    var headerElements: [String]

    var weight: CGFloat
    var color: UIColor        
}

struct Card: Item {
    var headerElements: [String]
   
    var name: String 
    var number: Int
}
// ...

现在,我想做的是为这些项目中的每一个创建一个表单视图控制器:

在此处输入图像描述

如您所见,这些表单中的每一个都包含一些基本组件:headerElements顶部的视图和创建按钮。唯一的区别是每个Item子类的形式不同。

我正在考虑做这样的事情:

class BaseItemFormViewController: UIViewController {
    @IBOutlet weak var headerElementsView: UIView!
    @IBOutlet weak var button UIButton!
    // ...
}

然后,每个Item子类都可以轻松继承:

class PenItemFormViewController: BaseItemFormViewController {
    @IBOutlet weak var inkColorTextField: UITextField!
    @IBOutlet weak var inkAmountTextField: UITextField!
    // ...
}

但是,困扰我的是,我必须使用相同的冗余元素(headerElements 和按钮)重新创建每个 XIB 文件,并将它们链接起来。

所以我想知道是否可以改为创建一个BaseItemFormViewController包含headerElements视图和创建按钮的视图,以及一个可以添加所需表单的空视图。然后,对于每个Item子类,只需创建相关表单并将其添加到BaseItemFormViewController. 像这样:

在此处输入图像描述

有什么办法可以做到这一点?

谢谢您的帮助!

标签: swiftuikitxib

解决方案


推荐阅读