26

在我的应用程序中,我有一个 UITableView 和一些按钮,用户可以单击这些按钮根据一些 NSDate 或整数对数组进行排序。所以这是我尝试对 UITableView 进行排序的方法:

- (void)sortStats:(id)sender reloadData:(BOOL)dataBool {
    NSSortDescriptor *descriptor = nil;
    UIButton *clickedButton = (UIButton*)sender;
    if (clickedButton.tag == 1) {
            descriptor = [NSSortDescriptor sortDescriptorWithKey:@"Date" ascending:NO];
    }
    [self.cellArray sortUsingDescriptors:[NSArray arrayWithObject:descriptor]];
    [[NSUserDefaults standardUserDefaults] setObject:self.cellArray forKey:@"cellArray"];
    if (dataBool) {
        [ivstatstableView reloadData];
    }
    [ivstatstableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];
}

所以最初我只是在没有 reloadData 参数的情况下使用了这个方法,因为 UITableView 上的 reloadData 似乎导致了崩溃。

这是控制台崩溃日志的内容:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“*** -[__NSPlaceholderArray initWithObjects:count:]:尝试从对象 [0] 插入 nil 对象”

无论如何,这里是否有任何代码会导致此崩溃?我真的很想让这个功能在我的应用程序中工作,我知道我即将修复它,但我不确定是什么导致了这个问题。

有任何想法吗?

4

2 回答 2

14

至少有一个地方可能发生这种情况,也许还有其他地方。在获取用户默认内容的代码中,您不检查nil. 所以代替这个:

[self.cellArray addObjectsFromArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"array"]];

你可能想试试这个:

NSArray *defaultCellArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"array"];
if (defaultCellArray) {
    [self.cellArray addObjectsFromArray:defaultCellArray];
}

失败的initWithObjects调用(根据您的错误消息)也可能嵌套在另一个调用中,也许在这个调用中:

[self.cellArray sortUsingDescriptors:[NSArray arrayWithObject:descriptor]];

如果您查看完整的调用堆栈,它会告诉您此调用是否正在进行后续调用initWithObjects并可能将其传递给nil. 例如,在您的情况下,如果尚未将要nil创建的数组的值设置为 1 或 2,您将传入 a yo 。您可能需要添加一个额外的 else 子句来帮助诊断问题:clickedButton.tag

if (clickedButton.tag == 1) {
        descriptor = [NSSortDescriptor sortDescriptorWithKey:@"Date" ascending:NO];
} else if (clickedButton.tag == 2) {
        descriptor = [NSSortDescriptor sortDescriptorWithKey:@"Score" ascending:NO];
} else {
    NSLog(@"Unexpected error: Can't determine sort descriptor");
}
于 2012-08-13T13:48:57.007 回答
2

这一切都非常复杂,但有一件事很突出:

[[NSUserDefaults standardUserDefaults] setObject:self.cellArray 
                                          forKey:@"cellArray"];

我认为您应该将其更改为:

NSArray *array = [NSArray arrayWithArray:self.cellArray];
[[NSUserDefaults standardUserDefaults] setObject:array forKey:@"cellArray"];

其次,在您认为应该有对象的每个地方之后添加 asserts() ,即:

UIButton *theButton = ...
assert(theButton);

您还说行数是 cellArray 计数的两倍,猜这是故意的。

于 2012-08-13T13:25:45.937 回答