如何在iPhone上的堆栈弹出视图控制器后自动调用方法
题
我需要在导航堆栈中弹出子视图后更新iPhone上的父视图。当子项弹出堆栈并且父项再次可见时,如何设置要通知的父视图或接收自动方法调用?
用户在用户完成后在父页面上显示我要显示的子页面上的数据并弹出视图。
谢谢你的帮助!
解决方案
我刚刚解决了这个同样的问题 - 上面的答案几乎是正确的,他们只是忘了设置代表。
我有一个根视图控制器,它显示列表的大小,调用可能改变列表大小的子视图控制器,并且必须在返回时更新大小。
当我创建父视图(下面的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
}
在子视图被关闭之后,以及在重新显示父视图之前调用它。
其他提示
我也需要做这样的事情。在拥有我的 UINavigationController 的 ViewController 中,我必须实现 willShowViewController ,如下所示:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
}
只要UINavigationController更改视图,就会调用该方法。如果我正确理解你的问题,我认为这应该做你想要的。
我认为这里有一些混乱。 UIView
不会被推送到 UINavigationController
的堆栈中。正在推送和弹出的是 UIViewControllers
,它依次处理一个或(通常)几个视图。
幸运的是, UIViewController
具有以下方法:
-(void) viewWillAppear:(BOOL)animated;
-(void) viewDidAppear:(BOOL)animated;
-(void) viewWillDisappear:(BOOL)animated;
-(void) viewDidDisappear:(BOOL)animated;
每当视图即将出现(dis)或刚出现(dis)时,都会调用它们。我使用标签栏,模态视图和导航控制器。 (在实现自定义控制器时,最好使用这些。)
所以在你的情况下,如果我理解正确,你只需要覆盖你所谓的“父页面”的 viewWillAppear
:或 viewDidAppear
:方法。 (可能是由 UIViewController
处理)并放入代码来更新页面的外观以反映刚刚输入的数据。
(如果我没记错的话,你必须确保 UINavigationController
在第一次显示时得到 viewWill / DidAppear:
消息,以便稍后将这些消息发送出去如果你用模板或IB设置它,你可能不必担心它。)
确保同时调用super方法。正确实施将如下所示:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"View Appearing");
}
如果您需要将一个控制器通知另一个控制器,您可以使用委托模式,如上所述这里(见第二个答案)。
不幸的是,如您所述,没有针对确切任务的自动通知(AFAIK)。 为了满足您的需求,您可以在子控制器的 viewWillDisappear 功能中向委托人(即您的父控制器)发送消息。