Iphone VIEWWILLISE和VIEWDID未调用

Iphone VIEWWILLISE和VIEWDID未调用,iphone,ios,uinavigationcontroller,uitabbarcontroller,viewwillappear,Iphone,Ios,Uinavigationcontroller,Uitabbarcontroller,Viewwillappear,这个问题很常见,但我无法用任何可用的答案来解决它 我正在开发iOS 5.1。我的导航控制器是选项卡栏视图控制器中的一个选项卡。有一个tableview,在其中选择一行将推送新的视图控制器 此问题仅在选择第二行时出现,有时也会出现。这是不正常的。 推送的视图为空-视图将出现/视图显示未被调用。单击导航栏的后退按钮-根视图的视图将显示/视图显示也不会被调用,使其为空 我以完全相同的方式在选择第一行/第二行时推动视图。但问题只发生在第二排 - (void)tableView:(UITableView

这个问题很常见,但我无法用任何可用的答案来解决它

我正在开发iOS 5.1。我的导航控制器是选项卡栏视图控制器中的一个选项卡。有一个tableview,在其中选择一行将推送新的视图控制器

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

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

- (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];
}
我试过了,但没有成功

  • 按下
    BViewController
    时会调用
    viewDidLoad
    ,但是,
    viewwillbeen
    viewdidbeen
    不会被调用。以下是我的
    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
    }
    
  • 这是不正常的。有时我会遇到这种情况,这种情况一直持续到我从后台关闭应用程序并重新启动它。但有时效果很好。我只是将视图控制器推到nab堆栈

  • 正如我在评论中提到的,它是选项卡栏控制器中的常规导航控制器


  • 如何定义
    AViewController
    BViewController
    的视图?通常您会使用
    initWithNibName
    ,例如

    AViewController *aObj = [[AViewController alloc] initWithNibName:@"mynibname" bundle:nil]`
    
    正如Carl指出的,您显然可以只使用
    init
    (虽然我在中没有看到这方面的文档),但是系统将非常详细地说明NIB文件的名称。不过,文档中确实指出,您可以使用
    initWithNibName
    并为NIB名称传递
    nil
    ,在这种情况下,它将尝试为您找到它。就个人而言,如果结果不一致,我会尝试使用
    initWithNibName
    并显式传递NIB的名称,看看这是否可以纠正这种情况

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

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

    更新:

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

  • 不用说,问题显然与上述代码无关。你需要扩大你的搜索范围,并向我们展示更多的代码。也许给我们看看你的B的
    viewDidLoad

  • 通常,当您没有获得此类事件时,是因为视图控制器层次结构与视图层次结构不同步。人们这样做最常见的方式是,如果他们在某个时候做过类似“
    [addSubview someNewController.view]
    ”的事情。如果您在任何上下文中使用视图控制器,而不是(a)您的应用程序代理的初始配置;(b)
    呈现视图控制器
    (或解除);或者(c)
    pushViewController
    (或pop),然后您可能想分享您所做的事情

  • 正如andreamazz所指出的,您的评论“我的导航控制器位于选项卡栏控制器的视图控制器内”,如果您逐字阅读,会有点令人不安。您可以将导航栏放在视图控制器的视图中,但不能将导航控制器放在视图控制器中(除非您正在执行视图控制器包含,这是一个完全不同的beast)。同样令人担忧的是,在您的另一个问题中,您说,“在UIViewController中嵌入UINavigationController或UIAbbarController(我的案例)会在调用这些方法时以某种方式中断。”问题是,您不会在其他视图控制器中嵌入导航控制器(除非它本身是一个容器控制器,比如选项卡视图控制器),但它的方式正好相反。但是如果你的字面意思是你有一个包含导航控制器的控制器,你必须向我们展示你是如何做到这一点的(正确的视图控制器控制?),因为这是非常不寻常的

  • 这是不寻常的,但我有一些项目被破坏了,最终处于奇怪的状态。至少,我可能会建议“产品”-“清理”并重建。如果问题仍然存在,并且您已经将问题隔离到B的NIB,然后临时重命名它,并从头开始快速构建一个脏的项目


  • init
    方法将调用
    initWithNibName:bundle:
    传递类名和主包的nib名称,如果OP是通过Xcode对话框添加的,那么它们的nib可能与类同名。因此,在不实现
    loadView
    的情况下,严格来说不需要提供nib名称。但值得检查该OP确实遵循了这个惯例!我不知道。我没有看到
    UIViewController
    类引用中记录了这一点,但我相信你的话。我知道如果你调用
    initWithNibName
    并传递
    nil
    作为nib名称,它会按照你所描述的那样做,但我不知道
    init
    会起作用在,也是。我正在加载带有笔尖的视图。。我尝试使用intwithNibname。但仍然不起作用。@Rob:viewDidLoad在按下BViewController时被调用,但是,ViewWillDisplay和ViewDidDisplay都没有被调用。@Rob:你找到了一些解决方法吗?我仍然无法解决此问题。。这种情况很少发生……但是我发现了这仍然不是一件好事。您所说的“我的导航控制器位于选项卡栏控制器的视图控制器内”是什么意思?导航控制器应该是选项卡栏视图控制器之一,您不需要将其包装在另一个视图控制器中。我指的是导航