将对象传递给UIViewController的子视图

时间:2013-07-10 14:13:32

标签: ios objective-c uitableview core-data uiviewcontroller

这可能很简单,但我无法理解它。我有一个UIViewController,其上放置了两个UITableView子视图(使用Storyboard)。

enter image description here

这两个都有自定义类,用于两个单独的项目列表。使用自定义类是因为可以在表之间拖放每个UITableView中的单元格。视图控制器被segued并具有使用segue推送的托管对象上下文。

我无法弄清楚如何将托管对象上下文(和其他对象)传递给UITableView子视图。对象在表视图类中定义。

我已将IBOutlets设置为每个表视图,因此可以引用UITableViews本身,但我没有自定义对象的可见性。

如何将对象传递给自定义类子视图?

2 个答案:

答案 0 :(得分:0)

  

我无法弄清楚如何传递托管对象上下文(和   其他对象)到UITableView子视图。

首先,不需要将托管对象上下文传递给表的子视图。 UITableView通过与其数据源进行通信来填充单元格 - 表格不知道它显示的数据。表的子视图是其单元格,以及来自数据源的单元格。大多数情况下,视图控制器充当表的数据源和委托 - 如果需要了解托管对象上下文,它是数据源,而且通常是视图控制器。

不考虑你是否将MOC传递给表格单元格或其他子视图的问题,让我们谈谈 如何做到这一点。为了使一个对象直接与另一个对象通信,第一个对象需要指向第二个对象的指针。如果你有一个指向对象的指针,你可以向对象发送你喜欢的任何消息(尽管如果对象实现了这个方法,它会有很多帮助!)。因此,第一项业务是查找您想要与之交谈的视图。

你说的是在你的表之间实现拖放,所以我猜你所讨论的子视图是一个表格单元格,你的放置操作涉及更改触摸结束的单元格。您可以通过首先将结束点转换为表的本地坐标,然后使用表的-indexPathForRowAtPoint:方法来获取触摸结束的表格单元格。获得行的索引路径后,可以通过-cellForRowAtIndexPath:获取相应的单元格。使用指向单元格的指针,您可以向单元格发送一条消息,传递您喜欢的任何参数。

最后,如果您 将采用此方法,您可能不需要传递托管对象上下文本身。拖动所代表的数据似乎更有可能是托管对象而不是托管对象 context ,因此它可能是您想要传递的托管对象。上下文是许多托管对象的容器,每个托管对象都有对它所在的上下文的引用,因此不需要单独传递上下文。

答案 1 :(得分:0)

一种选择是创建自定义单元格并将其传递给cellForRowAtIndexPath中的托管对象。

@interface CustomCell : UITableViewCell {
}
@property (weak) NSManagedObject *managedObject
@end

然后

- (UITableViewCell *)tableView:(UITableView *)tableView
    cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    CustomCell *cell =
        [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // get your managed object
    NSManagedObject *managedObject = [_fetchedResultsController objectAtIndexPath:indexPath];

    cell.managedObject = managedObject;
}

等等。

此外,您可能会发现使用核心数据框架(例如Sensible TableView)非常方便。框架将自动处理为所有单元格字段填充数据,并且还将自动生成所有详细信息视图。使用Core Data时节省了大量时间。