如何在一个视图控制器中具有 2 个表视图,其中一个表视图依赖于另一个表视图



我正在创建一个应用程序,该应用程序需要具有 2 个链接到核心数据的 TableViews。第一个表视图是父表视图,其中用户需要在第二个表视图填充关联数据之前选择它。我一直在寻找示例和解决方案,但我遇到了 FetchRequest 控制器的问题。它如何知道要查询哪个表?

我在这里看到了一个例子,但它不是那么完整。 或者至少,它没有给出有关如何设置第二个表视图的委托和数据源的完整详细信息。 好吧,委托是视图控制器,但是数据源呢? 它如何知道要从哪些数据中提取?

我希望你们能帮助解决这个困境,或者至少给我举一个例子。

我会使用UIViewController而不是UITableViewController。 在代码或情节提要中添加两个UITableViews,并为它们创建两个属性 - 假设parentTableViewchildTableView。 使视图控制器既是两个表视图的委托又是数据源。 实现相关方法时,首先检查方法调用中传递的 tableView 参数,并提供相关数据:

if (tableView == self.parentTableView) {
    // provide data relevant to the parent...
} else { // provide data relevant to the child...
}
若要为表提供数据,可以为父表使用

一个提取的结果控制器,然后使用父-子关系为子表视图派生数据(例如,对于子表视图的numberOfRowsInSection,可以使用 [self.selectedParent.children count] 等)。 这将正常工作,但您将失去对子对象使用提取结果控制器的好处:自动表部分,以及在插入/更新/删除新子对象时自动更新。

如果您愿意,可以使用两个单独的提取结果控制器 - 一个用于父对象,另一个用于子对象。 为每个属性创建一个属性,例如 parentFRCchildFRC ,然后使用相关的属性在 tableView 委托方法中提供数据,如上所述。 对于childFRC,您应该设置一个谓词,该谓词将获取的子对象限制为父对象是parentTableView中所选父对象的子对象。 (当所选父项发生更改时,您需要重新执行childFRC的提取)。

如果使用 NSFetchedResultController 委托方法跟踪对数据的更改,则应再次将视图控制器设置为两个 FRC 的委托,并在实现相关方法时,检查方法调用中传递的 fetchedResultController 参数以确定已更改的对象(父对象或子对象)并更新相应的表。

最新更新