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 没有被调用。 是导航控制器的委托集吗?这个类的头文件中有 吗? 是的,我尝试在上一个视图和调用 popViewController 的视图中都这样做,并且在这两个地方都没有调用它【参考方案2】:

我刚刚遇到了一个非常相似的问题,经过一些测试发现调用 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 正在占用内存

popViewController 适用于一个视图,而不是另一个

PopViewController 没有效果

popViewController(animated: true) 动画运行缓慢

popViewController 和 pushViewController 动画