程序化 UI:如何引用在自定义 UIView 中为自定义 UIView 之外的 View Controller 创建的 UITableView?

Programmatic UI: How to reference UITableView created in a custom UIView for View Controller outside of the custom UIView?

我的应用程序完全以编程方式完成,因此没有 StoryBoard 或 nil/xib 文件。 我的应用程序包含一个带有两个选项卡的 UITabBar 控制器,每个选项卡都有一个导航栏。我还没有处理第一个选项卡,所以它现在是空白的 (MenuViewController)。第二个(CafeViewController)将有一个垂直堆栈视图(在安全区域),上半部分有一个 MKMapView,下半部分有一个 UITableView。

我为我的 CafesViewController 创建了一个自定义 UIView,这是我拥有堆栈视图的地方。在那个自定义 UIView 中,我放置了我的 mapView 和 tableView 的代码并添加了所有约束。我需要帮助的是如何从 CafesViewController 继续为 tableView 设置委托和数据源。我不知道如何从 CafesViewController 引用 tableView。

我尝试的是通过在 CafesViewController 上创建一个 tableView 来创建一个引用,但我很快意识到它实际上会创建另一个 tableView 并且它与我的自定义视图中的不同。我在网上搜索了如何执行此操作,但找不到如何完全以编程方式以及如何使用位于自定义视图中的 tableView 来执行此操作。注意:我知道视图和 tableView 可以从视图控制器完成,但我试图通过尽可能多的重构来保持我的视图控制器尽可能干净。

我的目标是学习如何首先引用 tableView 的第一步,然后学习重构 tableView 委托和数据源以与 CafesViewController 分开。

这是我的自定义 UIView 和 CafesViewController(我目前正在使用的主控制器)的一些图片

Custom UIView for the CafesViewController

CafesViewController

你可以简单地这样做:

在CustomUIView中,像这样定义两个弱引用:

weak var delegate : UITableViewDelegate? = nil {
    didSet{
        self.tableView.delegate = delegate
    }
}

weak var dataSource : UITableViewDataSource? = nil {
    didSet{
        self.tableView.dataSource = self
    }
}

并且在您的 viewController 中,在 loadView 方法中:

var cafesView : CafesView = CafesView()
cafesView.delegate = self
cafesView.dataSource = self
self.view = cafesView

然后,您可以在 ViewController.

中简单地实现这两个协议