导航控制器推送零视图控制器错误
Posted
技术标签:
【中文标题】导航控制器推送零视图控制器错误【英文标题】:Navigation controller push nil view controller error 【发布时间】:2011-06-02 16:31:35 【问题描述】:我的应用中的导航控制器出现了一些问题。从 RootViewController 移动到 UITableViewController 工作正常。我现在想要多一层向下钻取,因此用户从列表中选择一个项目并出现一个新屏幕,如下所示:
RootViewController --> TableViewController --> ItemViewController
我使用了完全相同的代码来切换第一个视图,但我得到了:
Application tried to push a nil view controller on target <UINavigationController...
代码和第一个一样,怎么可能是nil呢?
在 RootViewController.h 中:
@interface RootViewController : UIViewController
IBOutlet TableViewController *tableViewController;
@property (nonatomic, retain) TableViewController * tableViewController;
在.m文件中我综合了属性,然后使用按钮调用:
[self.navigationController pushViewController:tableViewController animated:YES];
在 TableViewController.h 中:
#import "ItemDetailViewController.h"
@class TableViewController;
@interface TableViewController : UITableViewController
IBOutlet ItemDetailViewController * itemDetailViewController;
@property (nonatomic, retain) ItemDetailViewController * itemDetailViewController;
@end
再一次,我在 .m 文件中合成它并使用代码将新视图推送到didSelectRowAtIndexPath:
[self.navigationController pushViewController:itemDetailViewController animated:YES];
当您点击某个项目时,我会收到上面的错误消息。有谁知道为什么会这样?
【问题讨论】:
“itemDetailViewController”和“plantDetailViewController”有什么联系? 对不起,错字!更改了名称以使其更易于阅读。 3 个笔尖,每个视图一个。 RootViewController、TableViewController、ItemViewController。 【参考方案1】:此错误的最常见原因是无法将itemDetailViewController
连接到 IB 中的实际对象。请注意,您通常应该将 IBOutlet
指示符放在属性上而不是 ivar 上。
【讨论】:
一切都按照 RootViewController 连接起来,并且所有连接都在那里并且正确。但是,我会切换 IBOutlet 指示符,也许是这样? 在调试器中,itemDetailViewController
是 nil 吗? TableViewController viewDidLoad
是 nil 吗?如果是这样,那么你就没有连接到你认为你连接到的东西。
如何检查?您的意思是使用工具并检查内存分配吗?
好的,刚刚做了一个 if 语句来检查 self.itemDetailViewController 是否为 nil,它是。知道为什么吗?一切都肯定与第一个视图相同。
也可以设置断点和po itemDetailViewController
。一个常见的原因是您的 NIB 尚未加载(viewDidLoad
尚未运行)。在第一次访问视图之前不会发生这种情况。另一个常见的错误是有重复的对象。当人们在 NIB 中连接一个对象并使用+alloc
创建同一类的对象时,通常会发生这种情况。这两个对象不相关。另一种可能性是您没有加载您认为的NIB。在-viewDidLoad
中设置断点,看看什么时候发生。以上是关于导航控制器推送零视图控制器错误的主要内容,如果未能解决你的问题,请参考以下文章