popviewcontroller没有调用viewWillappear

时间:2011-09-27 05:30:01

标签: iphone objective-c uinavigationcontroller

我正在使用以下代码在用户点击按钮时显示上一个视图

[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];

}

我使用以下代码

在app委托中设置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并且没有被调用。我不知道为什么突然间会看到威尔·阿帕尔被召唤。

3 个答案:

答案 0 :(得分:9)

确保设置了导航控制器的委托,然后使用此功能在要调用viewWillAppear的类中调用viewWillAppear:

- (void)navigationController:(UINavigationController *)navigationController 
      willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{
    [self viewWillAppear:animated];
}

答案 1 :(得分:4)

我刚刚遇到的问题非常相似,经过一些测试后发现调用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];
});

答案 2 :(得分:0)

我也遇到了这个问题,根本原因是因为我将self.navigationController.delegate = self放在viewDidLoad上。我的解决方案是将委托置于viewWillAppear上:

- (void)viewWillAppear:(BOOL)animated{
   [super viewWillAppear:animated];
   self.navigationController.delegate = self;
}

在那之后,popViewController将打到viewWillAppear。