【发布时间】:2010-11-03 08:09:17
【问题描述】:
从导航堆栈中弹出子视图后,我需要更新 iPhone 上的父视图。如何设置当子视图从堆栈中弹出并且父视图再次可见时通知父视图或接收自动方法调用?
用户在子页面上输入我想在用户完成后显示在父页面上的数据并弹出视图。
感谢您的帮助!
【问题讨论】:
标签: iphone model-view-controller view uiview stack
从导航堆栈中弹出子视图后,我需要更新 iPhone 上的父视图。如何设置当子视图从堆栈中弹出并且父视图再次可见时通知父视图或接收自动方法调用?
用户在子页面上输入我想在用户完成后显示在父页面上的数据并弹出视图。
感谢您的帮助!
【问题讨论】:
标签: iphone model-view-controller view uiview stack
Felixyz 的回答对我有用。每次视图出现时,调用 view will appear 方法都会运行其中的代码。与 view did load 不同,后者仅在第一次加载视图时运行其代码。因此,如果子视图更改了父视图中显示的信息,您的父视图将不会自行更新,然后被弹出。但是如果父母调用视图会出现,则每次视图显示备份时都会运行代码。
确保同时调用超级方法。正确的实现应该是这样的:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"View Appearing");
}
【讨论】:
我认为这里有些混乱。 UIViews 不会被推入和弹出UINavigationController 的堆栈。被推送和弹出的是UIViewControllers,它依次处理一个或(更经常)几个视图。
幸运的是,UIViewController 有这些方法:
-(void) viewWillAppear:(BOOL)animated;
-(void) viewDidAppear:(BOOL)animated;
-(void) viewWillDisappear:(BOOL)animated;
-(void) viewDidDisappear:(BOOL)animated;
每当视图即将 (dis) 出现或刚刚 (dis) 出现时都会调用它们。我使用标签栏、模式视图和导航控制器。 (当您实现自定义控制器时,最好利用这些。)
因此,在您的情况下,如果我理解正确,您只需在您所谓的“父页面”(可能由 UIViewController 处理)上覆盖 viewWillAppear: 或 viewDidAppear: 方法,然后输入代码来更新页面的外观以反映刚刚输入的数据。
(如果我没记错的话,您必须确保 UINavigationController 在首次显示时收到 viewWill/DidAppear: 消息,以便稍后将这些消息发送到其子控制器。如果您使用一个模板或在 IB 中你可能不必担心它。)
【讨论】:
我刚刚解决了同样的问题 - 上面的答案几乎是正确的,他们只是忘记了设置委托。
我有一个显示列表大小的根视图控制器,调用可能改变列表大小的子视图控制器,并且必须在返回时更新大小。
当我创建父视图(下面的 SettingsView)并将其添加为 UINavigationController 的根视图时,我确保在显示视图之前设置 UINavigationController 的委托 - 这是关键部分:
SettingsView *sv = [[SettingsView alloc] initWithNibName:@"SettingsView" bundle:nil];
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:sv];
[nc setDelegate:sv];
在父视图中,实现 UINavigationControllerDelegate 协议:
@interface SettingsView : UIViewController <UINavigationControllerDelegate>
并提供 willShowViewController 方法:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
// Your code to update the parent view
}
在子视图被关闭后,父视图重新显示之前调用。
【讨论】:
如果您需要将一个控制器通知给另一个控制器,您可以使用here (see 2nd answer) 中描述的委托模式。
不幸的是,您描述的确切任务没有自动通知(AFAIK)。 为了满足您的需求,您可以在您的子控制器的 viewWillDisappear 函数中向委托(即您的父控制器)发送消息。
【讨论】:
viewWillDisappear 在孩子推孙子以及孩子被弹出时被调用。只有在后一种情况下,您才想向父母发送消息。我还没有找到解决这个问题的优雅方法。
我也需要做这样的事情。在拥有我的 UINavigationController 的 ViewController 中,我必须实现 willShowViewController,如下所示:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
}
每当 UINavigationController 更改视图时,都会调用该方法。如果我正确理解您的问题,我认为这应该可以满足您的要求。
【讨论】: