这个问题非常频繁,但我无法用任何可用的答案解决这个问题。
我正在使用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];
}
viewDidLoad
时正在调用 BViewController
,但是,viewWillAppear
和viewDidAppear
未被调用。以下是我的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堆栈。
正如我在评论中提到的,它是标签栏控制器中的常规导航控制器。
答案 0 :(得分:0)
您如何定义AViewController
和BViewController
的观看次数?通常你会使用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讨论。
<强>更新强>
根据您的反馈,我有几点想法:
毋庸置疑,问题显然与上述代码无关。您需要扩大搜索范围并向我们展示更多代码。也许告诉我们你的viewDidLoad
B?
通常,当您没有获得这些类型的事件时,这是因为视图控制器层次结构与视图层次结构不同步。人们这样做的最常见方式是,如果他们在某些时候做过类似“[addSubview someNewController.view]
”的事情。如果您在任何上下文中使用视图控制器,或者(a)您的应用程序委托的初始配置; (b)presentViewController
(或解雇);或者(c)pushViewController
(或流行),那么你可能想分享你所做的事情。
正如andreamazz指出的那样,你的评论“我的导航控制器位于标签栏控制器的视图控制器内部”,如果一个人按字面意思读取它会有点令人不安。您可以将导航栏放在视图控制器的视图中,但是您不能将导航控制器放在视图控制器中(除非您正在进行视图控制器包含,这是一个完全不同的野兽)。同样令人担忧的是,在你的另一个问题中,你说过,“在UIViewController中嵌入一个UINavigationController或UITabBarController(我的情况)会以某种方式中断这些方法的调用。”事实上,你没有在其他视图控制器中嵌入导航控制器(除非它本身就是一个容器控制器,如标签视图控制器),而是反过来。但是,如果你的字面意思是你有一个包含导航控制器的控制器,你必须向我们展示你是如何做到的(正确的视图控制器包含?),因为这是非常不寻常的。
这是不寻常的,但我已经让项目被破坏,最终陷入了奇怪的状态。至少,我可能会建议“产品” - “清洁”并重建。如果问题仍然存在,并且您已将问题隔离到B的NIB,则暂时将其重命名并从头开始构建快速且脏的问题。