从导航堆栈中弹出子视图后,我需要更新 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
s 不会被压入或从UINavigationController
' 的堆栈中弹出。被推送和弹出的是UIViewControllers
,它们依次处理一个或(更经常)几个视图。
幸运的是,UIViewController
有这些方法:
-(void) viewWillAppear:(BOOL)animated;
-(void) viewDidAppear:(BOOL)animated;
-(void) viewWillDisappear:(BOOL)animated;
-(void) viewDidDisappear:(BOOL)animated;
每当视图即将 (dis) 出现或刚刚 (dis) 出现时,都会调用这些函数。我使用标签栏、模式视图和导航控制器。(当您实现自定义控制器时,使用这些是一个好主意。)
因此,在您的情况下,如果我理解正确,您只需覆盖您所谓的“父页面”(可能由 a 处理)上的viewWillAppear
: 或: 方法并输入代码以更新页面的外观以反映刚刚输入的数据。viewDidAppear
UIViewController
(如果我没记错的话,您必须确保在首次显示时UINavigationController
收到一条viewWill/DidAppear:
消息,以便稍后将这些消息发送到其子控制器。如果您使用模板或在 IB 中进行设置,您可能不会不必担心。)
Felixyz 的回答对我有用。每次视图出现时,调用 view will appear 方法都会运行其中的代码。与 view did load 不同,后者仅在第一次加载视图时运行其代码。因此,如果子视图更改了父视图中显示的信息,您的父视图将不会自行更新,然后被弹出。但是如果父母调用视图将出现,则每次视图显示备份时都会运行代码。
确保同时调用超级方法。正确的实现如下所示:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"View Appearing");
}
如果您需要将一个控制器通知给另一个控制器,您可以使用此处描述的委托模式(参见第二个答案)。
不幸的是,您描述的确切任务没有自动通知(AFAIK)。为了满足您的需要,您可以在您的子控制器的viewWillDisappear函数中向委托(即您的父控制器)发送消息。