使用 UINavigationController 从另一个控制器更新或重新加载 UIViewController?

Posted

技术标签:

【中文标题】使用 UINavigationController 从另一个控制器更新或重新加载 UIViewController?【英文标题】:updating or reloading a UIViewController from another Controller using UINavigationController? 【发布时间】:2011-09-08 00:09:11 【问题描述】:

我有一个 ios 应用程序,它有一个 mainControllerView,在那里我创建了一个 UINavigationController,然后我将一个名为 FirstViewController 的新 UIViewController 和其他视图推送到该 UINavController 中。

总之是这样的:

MainController(UIVIewController) 
   |  
    --> UINavController 
         | 
          --> FirstViewController(UIViewController)
         |
          --> SecondViewController(UIViewController)
         |
          --> AddViewController

另外,在 FirstViewController 内我有一个 UITableView,UITableView 由 CoreData 提供。

现在,我决定在右上角(导航栏)添加一个“加号”系统按钮,以将另一行添加到数据库中,因此应该反映到 UITableview 中。

我所做的是创建另一个自定义视图,称为 AddViewController,当我按下“加号”按钮时,它会被推入 NavController 堆栈。在那个视图中,我只是添加了一些文本字段和一个按钮来更新数据库,这是有效的,但是,当我按下返回时,我找不到更新 FirstViewController 内部的 UITableView 的方法。

简而言之,

UINavController(with FirstViewController)
 1.-When I press the "+" button another UIViewController (AddViewContronller) 
    is pushed
 2.-In that view I present a few UITextfields to be filled.
 3.-I press a "save" button on the NavigationBar, that button save info 
    into the DB and then it goes back the FirstViewController, popping the current
    UIViewController(AddViewController)
 4.-FirstViewController and its tableView is on the main screen again, however
    the rows are still the same.

当我按下 AddViewController 中的保存按钮时,我一直在尝试更新 FirstViewController,但正如我所说,我没有成功。

我没有尝试过的选项是在我跳转到另一个 UIViewController 时释放 FirstViewController,然后在后面重新分配,但我不认为这是一个好主意,因为使用 NavigationController 我可以跟踪我的所有视图控制器入栈。

所以任何人都知道我应该怎么做才能从另一个 UIViewController 刷新/重新加载视图 (UIViewController),在我的情况下从 AddViewController 更新 FirstViewController 视图?

另外,我想知道我是否在正确的轨道上?或者我想做的事情可以很容易地用另一种方法来完成,比如模态对话框?

任何帮助将不胜感激

干杯, 劳尔

【问题讨论】:

你使用 NSFetchedResultsController 来填充你的表格视图吗? 不,我刚刚创建了一个获取数据的方法,我想在每次需要更新 TableView 时调用。我这样做是因为我不知道 NSFetchResultsController ......现在快速浏览一下,这似乎是要走的路...... 【参考方案1】:

您可以尝试处理 NSManagedObjectContextObjectsDidChangeNotification 通知。例如:

- (void)viewDidLoad 
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(dataDidChange)
                                                 name:NSManagedObjectContextObjectsDidChangeNotification
                                               object:nil];


- (void)dealloc 
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:NSManagedObjectContextObjectsDidChangeNotification
                                                  object:nil];


- (void)dataDidChange 
    [self.tableView reloadData];

【讨论】:

【参考方案2】:

首先,如果你不熟悉UITableView,你应该阅读Table View Programming Guide for iOS。

如果你使用 Core Data 来填充你的 UITableView,你几乎总是应该使用 NSFetchedResultsController

【讨论】:

以上是关于使用 UINavigationController 从另一个控制器更新或重新加载 UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationcontroller 中未使用的视图会发生啥?

使用 push segue 时 UINavigationController 是不是强制

UINavigationController - 使用 UIBlurEffect 清除背景

一起使用 UITabBarController 和 UINavigationController

iPhone - UINavigationController - 使用 CATransaction 自定义动画

如何在 SwiftUI 中使用 UINavigationController