从推送的 viewController 到 rootViewController 的信息

Posted

技术标签:

【中文标题】从推送的 viewController 到 rootViewController 的信息【英文标题】:Information from pushed viewController to rootViewController 【发布时间】:2010-11-22 10:00:36 【问题描述】:

一个简单的问题。我在导航控制器中有一个表格视图。当我触摸一个单元格时,它会推送一个包含单元格信息的视图控制器,因此我可以在新视图中对其进行编辑。现在工作正常(我们可以将其称为信息路径:“rootviewcontroller -> push viewcontroller”)。但是当我在新视图中点击保存时,我希望在调用popviewcontroller(信息路径:“pushed viewcontroller -> rootviewcontroller”)之前将编辑的值返回到rootviewcontroller,这样编辑后的值就可以显示在tableview中。

解决这个问题的正确方法是什么?

编辑:

pushViewController 和 popViewController 正在工作。我只要求在调用保存按钮 (popViewController) 时将编辑后的信息返回到 rootViewController 以显示在 tableview 中的最佳方法。我想我只需要直接从推送的 viewController 中使用新信息编辑 pList。虽然我更喜欢将新信息发送到 rootViewController 并让它处理对 pList 文件的访问。

【问题讨论】:

嗨,John,您是否使用 CoreData 来管理您的数据?请发布有关您的实施的更多详细信息,以便我们提供帮助。 【参考方案1】:

我有同样的情况 - 两个表视图。第一台电视显示一个数据库记录列表,当点击一个时,它会进入第二个显示记录详细信息的 TableView。我通过将详细信息 TableViewController 推送到导航控制器堆栈来做到这一点。到目前为止,一切都很简单。

我遇到的问题是,在详细表视图(控制器)中更新记录后,我想让列表表视图控制器知道,以便它可以更新记录列表。

我做的第一件事是向详细信息表视图控制器添加一个属性,以便在记录列表中选择一行时,列表控制器可以将核心数据托管实体传递给详细信息控制器。

同时,我还添加了列表控制器作为核心数据更改事件的观察者,如下所示:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataSaved:) name:NSManagedObjectContextDidSaveNotification object:nil];

因此,如果详细信息表视图和控制器更新记录,列表控制器将调用其dataSaved: 方法,并传递一个 NSNotification 对象。

dataSaved: 方法中,我检查对象,如果正在编辑的核心数据实体在更新列表中,那么我设置一个标志来表示需要更新。但是,如果插入的列表中有记录,则意味着已创建新记录并插入到数据库中,因此设置了一个标志以触发列表表视图的完全重新加载。

当用户返回列表视图控制器时,viewDidAppear: 方法被触发。在这种方法中,我检查标志并调用

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

如果记录已更新,则重新加载特定记录,或者如果插入新记录,则告诉表视图进行完全重新加载。

最后我删除了列表控制器作为核心数据通知的观察者,因为它不再感兴趣。

我不知道这是否是推荐的方法,但到目前为止它对我有用。

【讨论】:

【参考方案2】:

您可以尝试在 popViewController 之前重新加载数据,但您应该发布一些代码。

【讨论】:

【参考方案3】:

所有 UIViewControllers 都有一个navigationController 方法。当您将视图控制器推送到导航控制器时,该属性将设置为指向导航控制器。

所以,只需在视图控制器中调用[self.navigationController popViewControllerAnimated:YES];

另外,不要混淆视图和视图控制器。当您在视图中单击保存时,您应该确保保存按钮调用视图控制器上的方法,该方法又与导航控制器对话。

【讨论】:

【参考方案4】:

点击一行时,您将进入包含适当信息的新视图。

在这里您执行一些操作,例如编辑数据。 所以首先点击保存按钮保存更改(通过调用 IBAction),在此 IBAction 方法中将检查是否(更改已成功保存)然后调用

[self.navigationController popViewControllerAnimated:YES];

并确保表通过更新的数据库重新加载(通过在 viewWillAppear 方法中调用数据库方法来更改数据数组)。

【讨论】:

以上是关于从推送的 viewController 到 rootViewController 的信息的主要内容,如果未能解决你的问题,请参考以下文章

从推送的 viewController 到 rootViewController 的信息

如何通过推送从 xib 转换到 ViewController

iOS Swift 从推送通知以编程方式导航到某些 ViewController

从 AppDelegate 应用崩溃时,在 NavigationController 中推送超过 3 个 ViewController

从嵌入式导航控制器推送 viewController 时的奇怪行为

如何找到推送了哪个 viewController?