我已经为我一直在制作的下钻表应用程序编写了一些代码,但应用程序仅在运行时崩溃。在构建应用程序时,Xcode不会给我任何错误。调试器输出:
2012-10-18 10:58:26.513秒[474:c07] - [NavController setItems:]:无法识别的选择器>发送到实例0xc217a00 2012-10-18 10:58:26.515秒[474:c07] *由于未捕获的异常终止应用>'NSInvalidArgumentException',原因:' - [NavController setItems:]:无法识别的选择器发送>到实例0xc217a00 “ * 第一次抛出调用堆栈: (0x14b8022 0xeb8cd6 0x14b9cbd 0x141eed0 0x141ecb2 0x3fbe 0xe2a1e 0x41401 0x41670 0x41836> 0xbfc9dd8 0x4872a 0x19596 0x1a274 0x29183 0x29c38 0x1d634 0x13a2ef5 0x148c195 0x13f0ff2> 0x13ef8da 0x13eed84 0x13eec9b 0x19c65 0x1b626 0x1d40 0x1cd9) 终止调用抛出异常
我想我明白错误在于NavController.m,其中:
- (void)viewDidLoad
{
[super viewDidLoad];
NSString* path = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
MasterViewController* root = (MasterViewController*)self.topViewController;
NSDictionary* thelist = [NSDictionary dictionaryWithContentsOfFile:path];
root.items = [thelist objectForKey:@"Items"];
root.navigationItem.title = [thelist objectForKey:@"name"];
}
顺便说一句,我制作了这样的数组项:(非原子,保留)NSArray *项目;
答案 0 :(得分:0)
问题可能在这里:
MasterViewController* root = (MasterViewController*)self.topViewController;
self.topViewController
可能不是MasterViewController的实例,而是一个NavController实例,你去了。
答案 1 :(得分:0)
应用程序崩溃,因为以下行:
root.items = [thelist objectForKey:@"Items"];
这一行只是写作的捷径:
[root setItems:[thelist objectForKey:@"Items"]];
运行时抱怨找不到方法setItems:
。编译错误的原因是因为您告诉编译器root
属于类MasterViewController
,但事实并非如此。在运行时,obj-c运行时发现root
实际上是类NavController
,而NavController
似乎没有setItems:
方法。
换句话说,这一行是错误的:
MasterViewController* root = (MasterViewController*)self.topViewController;
你在课堂上撒谎; self.topViewController
返回类NavController
的对象,但是强制编译器将其视为MasterViewController
,一旦调用{{1}找不到的方法,它将失败}}