【问题标题】:How can I reuse a table view in multiple view controllers in Swift?如何在 Swift 的多个视图控制器中重用表视图?
【发布时间】:2018-04-04 13:05:35
【问题描述】:

我现在正在开发一个应用程序,它需要在我的应用程序的多个场景中使用完全相同的表格视图,但是,表格的数据和位置将会改变,如这两张图片所示(表格视图在红色)

在整个应用程序中的所有表格实例中,它应该具有:

  1. 相同的委托方法
  2. 相同的数据源方法(尽管实际数据会发生变化)
  3. 具有相同出口和操作的相同表格视图单元格类型。
  4. 相同的内部约束(我不想每次都为表格单元格手动添加约束)。

现在我正在将它们编码为两个单独的视图控制器中的两个单独的表视图,但是,我意识到我需要在我的应用程序中的更多地方复制相同的表和逻辑,这感觉不喜欢正确的方式。所以我的问题是,如何在 iOS 中(使用 interface builder 或 swift)以干净干燥的方式完成符合上述规范的表复制?

【问题讨论】:

  • 那些是静态表格视图吗?为什么不使用为表格视图提供数据的服务,并且您关心使用正确的自定义 tableViewCell
  • 这个场景你必须使用容器视图。

标签: ios swift xcode uitableview interface-builder


【解决方案1】:

如果您想设计一次单元格,然后在不同视图控制器的不同表格视图中使用它们,您必须在单独的 .xib 文件中设计它们。原型单元是每个视图控制器,并且不能很好地扩展。

如果所有数据源和委托方法都相同,您可以将此协议的实现移至单独的类。您可以使用要显示的项目数组配置此类。

class ReusableTableView: NSObject, UITableViewDataSource, UITableViewDelegate
{
    var tableView: UITableView
    var tableViewData: [String]

    init(_ tv: UITableView, _ data: [String])
    {
        tableViewData = data
        tableView = tv
        super.init()
        tableView.delegate = self
        tableView.dataSource = self

        // Register all of your cells
        tableView.register(UINib(nibName: "SomeNib", bundle: nil), forCellReuseIdentifier: "example-id")
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tableViewData.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        return tableView.dequeueReusableCell(withIdentifier: "example-id", for: indexPath)
    }
}

拥有这两个构建块,您可以在每个视图控制器上分别布局表格视图,并将其与可重用的数据源/委托连接起来。

class ExampleTablewViewController: UIViewController
{
    @IBOutlet weak var tableView: UITableView!
    var reusableTableView: ReusableTableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        reusableTableView = ReusableTableView(tableView, ["lorem", "ipsum", "dolor"])
        reusableTableView.tableView.reloadData()
    }
}

您可以在GitHub repo 中找到我如何看待这一点的基本示例。

【讨论】:

  • 什么是 TableViewControl() ?它应该是 ReusableTableView() 吗?
  • 是的,你是对的。它应该是 ReusableTableView。我会改正这个错误。
  • 另外,这将如何与自动布局一起使用?单元格本身是否位于 .xib 文件中,然后您会使用唯一标识符卸载该文件吗?我试图弄清楚如何在多个不同的视图控制器中拥有特定的单元格布局,但保持指定的自动布局。谢谢
  • 单元的可重用性在这里不是强制性的,但出于性能原因强烈推荐。您必须在 .xib 文件中定义单元格(正常使用自动布局),然后必须使用可重用标识符注册它们。它将作为正常的原型单元工作。我在答案中链接了示例项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2015-06-19
  • 1970-01-01
  • 2017-06-10
  • 2017-10-02
  • 1970-01-01
相关资源
最近更新 更多