使用UITableView的应用程序在iPad模拟器上运行,但在iPhone模拟器上崩溃

时间:2013-06-25 05:05:32

标签: iphone uitableview

我已经实现了一个可以在所有iOS设备上运行的通用应用。最近,我遇到了一个奇怪的问题,我的应用程序将在iPhone模拟器上失败,但在iPad模拟器上会顺利进行。

我发现程序中哪个部分有错误,但我不知道修复它。在AppDelegate中,我有这段代码:

id someController=[self.tabBarController.viewControllers objectAtIndex:3];

if ([someController isKindOfClass:[UINavigationController class]]){
    someController = [someController topViewController];
}
if ([someController isKindOfClass:[iPhone_ASRAViewController class]]) {

    iPhone_ASRAViewController *myIPhone_ASRAViewController=(iPhone_ASRAViewController*)someController;
    myIPhone_ASRAViewController.listData=[NSArray arrayWithArray:vocabulary_];
    [myIPhone_ASRAViewController.table reloadData];
} 

应用程序从远程数据库加载数据,称为vocabulary_,由JSON实现到我的iPhone_ASRAViewContriller的NSArray属性,名为listData,然后在tableview上显示。

为了连接表中显示的词汇,我的代码如下:

NSMutableArray *cells = [[NSMutableArray alloc] init];
for (NSInteger j = 0; j < [table numberOfSections]; ++j)
{
    for (NSInteger i = 0; i < [table numberOfRowsInSection:j]; ++i)
    {
        [cells addObject:[table cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:j]]];
    }
}
NSString *postmsg=@"SA_VC=0&select_language=english&txtFilePath=";
for (UITableViewCell *cell in cells)
{
    NSString *temp=[postmsg stringByAppendingString:cell.textLabel.text];
    postmsg=[temp stringByAppendingString:@"\r\n"];
}
NSString *final_postmsg=[postmsg stringByAppendingString:@"&waveBase64=%@"];
NSLog(@"%@",final_postmsg);

当我在iphone模拟器上模拟应用程序时,会出现一些错误消息:

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'

该应用程序似乎没有连接iPhone模拟器下的“表”中的字符串。任何人都可以给我一个建议吗?

以下代码是我对tableView的实现:cellForRowAtIndexPath:

static NSString *TableIdentifier = @"tableidentifier"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:TableIdentifier];  
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:TableIdentifier] autorelease]; 
NSDictionary *voc_list=[listData objectAtIndex:indexPath.row];
NSLog(@"%@",voc_list);
cell.textLabel.text = [[(NSDictionary*)voc_list objectForKey:@"vocabulary_list"]objectForKey:@"Vocabulary"];
cell.detailTextLabel.text=[[(NSDictionary*)voc_list objectForKey:@"vocabulary_list"]objectForKey:@"Translation"];
cell.textLabel.font = [UIFont boldSystemFontOfSize:15];

1 个答案:

答案 0 :(得分:3)

你的问题就是这段代码:

[cells addObject:[table cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:j]]];

尤其是你尝试从tableView cellForRowAtIndexPath:获取一个单元格。

此方法不保证将返回单元格。如果单元格不可见,则此方法将返回nil。

这可能适用于iPad,因为屏幕尺寸较大,所有细胞都可见。在iPhone上,并非所有单元格同时可见,因此cellForRowAtIndexPath:将为某些indexPath返回nil。

从dataSource获取数据,而不是从tableView获取数据。 tableView是一个视图,它不存储数据。