4

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

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

仅在选择第二行时才会出现此问题,并且仅在某些时候出现。这不正常。Pushed 视图变为空白 - 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];
}

我试过这个这个但徒劳无功。

  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. 正如我在评论中提到的,它是标签栏控制器中的常规导航控制器。

4

1 回答 1

0

你如何定义你对AViewController和的看法BViewController?通常你会使用initWithNibName,例如

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

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

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

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

更新:

鉴于您的反馈,我有几个想法:

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

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

  3. 正如 andreamazz 所指出的,您的评论“我的导航控制器位于选项卡栏控制器的视图控制器内”,如果从字面上阅读它会有点令人不安。您可以将导航栏放在视图控制器的视图中,但不能将导航控制器放在视图控制器中(除非您正在执行视图控制器包含,这是一个完全不同的野兽)。同样令人担忧的是,在您的另一个问题中,您说:“在 UIViewController 中嵌入 UINavigationController 或 UITabBarController(我的情况)会以某种方式中断这些方法的调用。” 问题是,您不会将导航控制器嵌入到其他视图控制器中(除非它本身就是一个容器控制器,例如选项卡视图控制器),而是相反。

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

于 2012-09-01T07:08:20.327 回答