popviewcontroller 没有调用 viewWillappear
Posted
技术标签:
【中文标题】popviewcontroller 没有调用 viewWillappear【英文标题】:popviewcontroller is not calling viewWillappear 【发布时间】:2011-09-27 05:30:01 【问题描述】:当用户单击按钮时,我正在使用以下代码显示上一个视图
[self.navigationController popViewControllerAnimated:YES];
在前面的视图中,我覆盖了 viewWillAppear 来初始化一些东西。但是,似乎没有调用 viewWillAppear 。我将 NSLog 放在 viewDidload、viewWillAppear、viewDidAppear 中,并且只调用了 viewDidAppear。这是正常行为吗?如果是,我应该覆盖什么事件以便进行初始化?谢谢。
根据请求 -viewWillAppear 用于上一个视图
- (void)viewWillAppear:(BOOL)animated
NSLog(@"ViewWillAppear");
//[[GameStore defaultStore] resetGame];
[self setHangmanImage];
NSLog([[[GameStore defaultStore] selectedList] label]);
[labelListName setText:[NSString stringWithFormat:@"List Name: %@", [[[GameStore defaultStore] selectedList] label]]];
[labelCurrentIndex setHidden:YES];
[labelCurrentWord setHidden:YES];
[[self navigationController] setNavigationBarHidden:NO];
[FlurryAnalytics logEvent:@"GameViewController - viewWillAppear"];
[self getNewQuestion];
NSLog(@"ViewWillAppear finish");
[super viewWillAppear:YES];
我使用以下代码在应用程序委托中设置 UINavigationalController
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
HomeViewController *hv = [[HomeViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc]
initWithRootViewController:hv];
// You can now release the itemsViewController here,
// UINavigationController will retain it
[hv release];
// Place navigation controller's view in the window hierarchy
[[self window] setRootViewController:navController];
[navController release];
// Override point for customization after application launch.
[self.window makeKeyAndVisible];
return YES;
更新
我不知道发生了什么,但昨晚在模拟器中再次尝试运行该应用程序但仍然存在此问题后,我决定保存所有内容并关闭我的计算机,因为它已经很晚了。
今天早上我重新打开我的电脑打开了 xcode,清理项目并构建并运行它,我解决了问题并调用了 -viewWillAppear。我没有改变任何东西和它的工作。我在 -willShowView 中添加了 NSLog 并且它没有被调用。我不知道为什么突然调用 viewWillAppear。
【问题讨论】:
出于好奇,您是否尝试过手动调用 -viewWillAppear? 如何手动调用 viewWillAppear?我是否从我调用 [self.navigationController popViewControllerAnimated:YES] 的视图中调用它?从? 是的 - 理想情况下,您应该将[previousView viewWillAppear:YES]
放在您的 -popViewControllerAnimated:
上方
因此,如果手动调用它不起作用,那么您可能在引用以前的视图时遇到问题,或者您错误地覆盖了-viewWillAppear:
。介意发布一些-viewWillAppear:
代码吗?
我假设 -viewWillAppear 用于前一个视图?
【参考方案1】:
确保您的导航控制器的委托已设置,然后使用此函数在您要调用其 viewWillAppear 的类中调用 viewWillAppear:
- (void)navigationController:(UINavigationController *)navigationController
willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
[self viewWillAppear:animated];
【讨论】:
我这样做了,但 willShowViewcontroller 没有被调用。 是导航控制器的委托集吗?这个类的头文件中有我刚刚遇到了一个非常相似的问题,经过一些测试发现调用 popViewControllerAnimated: 在一个块中(来自 AFNetworking 中的网络响应)viewDidAppear 没有在父视图中调用。 在这里对我有用的解决方案是在主线程中调用它。
dispatch_async(dispatch_get_main_queue(), ^
// If not called on the main thread then the UI doesn't invoke the parent view's viewDidAppear
[self.navigationController popViewControllerAnimated:YES];
);
【讨论】:
【参考方案3】:我也遇到了这个问题,这个问题的根本原因是因为我把 self.navigationController.delegate = self 放在 viewDidLoad 上。我的解决方案是将代表团放在 viewWillAppear 上:
- (void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
self.navigationController.delegate = self;
popViewController 之后会点击 viewWillAppear。
【讨论】:
以上是关于popviewcontroller 没有调用 viewWillappear的主要内容,如果未能解决你的问题,请参考以下文章
调用 popViewController 时是不是可以跳过几个控制器并到达根视图控制器?
popViewController 适用于一个视图,而不是另一个