将对象传递给 UIViewController 的子视图

Posted

技术标签:

【中文标题】将对象传递给 UIViewController 的子视图【英文标题】:Passing an object to a subview of UIViewController 【发布时间】:2013-07-10 14:13:32 【问题描述】:

这可能真的很简单,但我无法理解它。我有一个 UIViewController,上面放置了两个 UITableView 子视图(使用情节提要)。

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

我想不通的是如何将托管对象上下文(和其他对象)传递给 UITableView 子视图。对象在表视图类中定义。

我为每个表视图设置了 IBOutlets,因此可以引用 UITableViews 本身,但我看不到自定义对象。

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

【问题讨论】:

【参考方案1】:

我想不通的是如何传递托管对象上下文(以及 其他对象)到 UITableView 子视图。

首先,不需要将托管对象上下文传递给表的子视图。 UITableView 通过与它的数据源对话来填充自己的单元格——该表对它所显示的数据一无所知。表格的子视图是它的单元格,它们来自数据源。大多数情况下,视图控制器充当表的数据源和委托——如果需要了解托管对象上下文,它就是数据源,而且通常是视图控制器。

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

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

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

【讨论】:

好的,我明白你在说什么,感谢您的详细回答,但是当两个 UITableViews 都有一个(不同的)自定义类时,我不确定这是如何工作的。处理拖放的代码包含在这些类中,因此我需要访问每个类中的核心数据对象。这有意义吗?【参考方案2】:

一种选择是创建一个自定义单元格并将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 框架非常方便。该框架将自动处理填充所有单元格字段的数据,并且还将自动生成所有详细视图。使用 Core Data 为我节省了大量时间。

【讨论】:

以上是关于将对象传递给 UIViewController 的子视图的主要内容,如果未能解决你的问题,请参考以下文章

将对象传递给自定义选民?

如何将对象传递给 innerHTML (JavaScript) 中的函数?

React:将对象传递给状态

将对象传递给 Java 中的不同库

将对象传递给新活动返回 null

如何将对象传递给另一个数组对象