4

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

我正在使用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但不成功。

  1. viewDidLoad被称为上推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. 正如我在评论中提到的那样,它是标签栏控制器中的常规导航控制器。

+0

你是什么意思'我的导航控制器是在标签栏控制器的视图控制器内'。 navcontroller应该是* TabBar视图控制器之一,您不需要将其包装在另一个viewController中。 – andreamazz

+1

我的意思是导航控制器作为标签栏控制器的一部分。 :) –

回答

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. 不用说,这个问题显然是不涉及到上面的代码。您需要扩大搜索范围并向我们展示更多代码。也许让我们看看你的B的viewDidLoad

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

  3. 正如andreamazz指出的那样,如果用户直接读到它,则您的评论“我的导航控制器位于标签栏控制器的视图控制器内部”有点令人不安。您可以将导航栏放在视图控制器视图中,但不能将导航控制器放在视图控制器中(除非您正在执行视图控制器控制,这是一个完全不同的野兽)。同样关心的是,在另一个问题中,你说,“在UIViewController中嵌入UINavigationController或UITabBarController(我的情况)以某种方式中断调用这些方法。”问题是,您不会将导航控制器嵌入到其他视图控制器中(除非它本身就是一个容器控制器,例如选项卡视图控制器),而不是其他视图控制器。但是,如果你的字面意思是你有一个包含导航控制器的控制器,那么你必须告诉我们你是如何做到的(正确的视图控制器控制?),因为这非常不寻常。

  4. 这是不寻常的,但我有项目被损坏,结束在奇怪的状态。至少,我可能会建议“产品” - “清洁”并重建。如果问题仍然存在,并且您已将问题隔离到B的NIB,那么暂时重命名它并从头开始构建一个快速而肮脏的问题。

+1

'init'方法会调用'initWithNibName:bundle:'传递类名称和主包的nib名称,如果通过Xcode对话框添加了OP,它们的nib可能与该类名称相同。因此,如果不实现'loadView',并不是必须提供一个nib名称。但值得一提的是,OP确实遵循了这一惯例! –

+0

我不知道。我没有看到'UIViewController'类参考文档中记载的内容,但我会为此付诸表示。我知道如果你调用'initWithNibName'并传递'nil'作为nib名字,它将按照你所描述的做,但我不知道'init'也会这样做。 – Rob

+0

嗯,好吧,很可能它会传递nil给initWithNibName:实际上如果initWithNibName的实现需要照顾它。这会让我觉得更有意义! –

相关问题