viewwillappear和viewdidappear没有被调用

时间:2012-09-01 05:28:37

标签: iphone ios uinavigationcontroller uitabbarcontroller viewwillappear

这个问题非常频繁,但我无法用任何可用的答案解决这个问题。

我正在使用iOS 5.1。我的导航控制器是标签栏视图控制器中的一个选项卡。有一个tableview,其中选择一行推动新的视图控制器。

仅在选择第二行时才会出现此问题。这不常见。 推送视图显示为空白 - viewWillAppear / viewDidAppear未被调用。单击导航栏的后退按钮 - 根视图的viewWillAppear / viewDidAppear也未被调用,使其空白。

我正在以完全相同的方式推动选择第一行/第二行的视图。但问题只发生在第二行。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    switch (indexPath.row) {
        case 0:
            AViewController *aObj = [[AViewController alloc] init];
            aObj.homeObj = self;
            [self.navigationController pushViewController:aObj animated:YES];
            [aObj release];
            break;
        case 1:
            BViewController *bVCObj = [[BViewController alloc] init];
            bVCObj.homeObj = self;
            [self.navigationController pushViewController:bVCObj animated:YES];
            [bVCObj release];
            break;
        default:
            break;
    }
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

我尝试了thisthis,但徒劳无功。

    在推送viewDidLoad时正在调用
  1. BViewController,但是,viewWillAppearviewDidAppear未被调用。以下是我的viewDidLoad

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor blackColor];
        NSLog(@"nav stack: %@", [self.navigationController viewControllers]);
        NSLog(@"nav stack: %@", [[self.navigationController visibleViewController] description]);
        //some initialization and call of methods
    }
    
  2. 这不常见。有时候我会得到这种情况,直到我从后台关闭应用程序并重新启动它。但有时它工作得很好。我只是将视图控制器推到nab堆栈。

  3. 正如我在评论中提到的,它是标签栏控制器中的常规导航控制器。

1 个答案:

答案 0 :(得分:0)

您如何定义AViewControllerBViewController的观看次数?通常你会使用initWithNibName,例如

AViewController *aObj = [[AViewController alloc] initWithNibName:@"mynibname" bundle:nil]`

正如卡尔指出的那样,你可以显然只使用init(虽然我没有在UIViewController Class Reference中看到这一点),但系统会非常特别地说明你的NIB名称文件。但是,文档确实说,您可以使用initWithNibName并传递nil作为NIB名称,在这种情况下,它会尝试为您找到它。就个人而言,如果您的结果不一致,我会尝试使用initWithNibName并明确传递您的NIB名称,看看是否能够纠正这种情况。

或者您是否在两个控制器中使用loadView以编程方式构建视图?然后,您需要向我们展示loadView例程(不要与viewDidLoad混淆)。

但根据文档,您需要指定NIB或使用loadView。请参阅UIViewController班级参考中的View Management讨论。

<强>更新

根据您的反馈,我有几点想法:

  1. 毋庸置疑,问题显然与上述代码无关。您需要扩大搜索范围并向我们展示更多代码。也许告诉我们你的viewDidLoad B?

  2. 通常,当您没有获得这些类型的事件时,这是因为视图控制器层次结构与视图层次结构不同步。人们这样做的最常见方式是,如果他们在某些时候做过类似“[addSubview someNewController.view]”的事情。如果您在任何上下文中使用视图控制器,或者(a)您的应用程序委托的初始配置; (b)presentViewController(或解雇);或者(c)pushViewController(或流行),那么你可能想分享你所做的事情。

  3. 正如andreamazz指出的那样,你的评论“我的导航控制器位于标签栏控制器的视图控制器内部”,如果一个人按字面意思读取它会有点令人不安。您可以将导航栏放在视图控制器的视图中,但是您不能将导航控制器放在视图控制器中(除非您正在进行视图控制器包含,这是一个完全不同的野兽)。同样令人担忧的是,在你的另一个问题中,你说过,“在UIViewController中嵌入一个UINavigationController或UITabBarController(我的情况)会以某种方式中断这些方法的调用。”事实上,你没有在其他视图控制器中嵌入导航控制器(除非它本身就是一个容器控制器,如标签视图控制器),而是反过来。但是,如果你的字面意思是你有一个包含导航控制器的控制器,你必须向我们展示你是如何做到的(正确的视图控制器包含?),因为这是非常不寻常的。

  4. 这是不寻常的,但我已经让项目被破坏,最终陷入了奇怪的状态。至少,我可能会建议“产品” - “清洁”并重建。如果问题仍然存在,并且您已将问题隔离到B的NIB,则暂时将其重命名并从头开始构建快速且脏的问题。