Попытаться вставить нулевой объект из объектов [0]?
В моем приложении у меня есть UITableView и некоторые кнопки, которые пользователь может щелкнуть, чтобы отсортировать массив в порядке, основанном на некоторых NSDate или ints. Итак, это мой метод, чтобы попытаться отсортировать мой 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, потому что казалось, что reloadData в UITableView вызывает сбой.
Вот что такое аварийный журнал консоли:
Завершение приложения из-за неперехваченного исключения "NSInvalidArgumentException", причина: "*** - [__ NSPlaceholderArray initWithObjects: count:]: попытка вставить нулевой объект из объектов [0] '
Во всяком случае, есть ли здесь код, который мог бы вызвать этот крах? Я действительно хочу, чтобы эта функциональность работала в моем приложении, и я знаю, что я близок к ее исправлению, но я просто не уверен, что вызывает эту проблему.
Любые идеи?
Ответы
Ответ 1
Существует, по крайней мере, одно место, где это может происходить, и, возможно, другие. В коде, где вы получаете содержимое пользовательских значений по умолчанию, вы не проверяете 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
yo массив, который вы создаете, если clickedButton.tag
еще не установлено в значение 1 или 2. Возможно, вы захотите добавить дополнительное условие else, чтобы помочь диагностировать проблема:
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");
}
Ответ 2
Все это довольно сложно, но одна вещь торчит:
[[NSUserDefaults standardUserDefaults] setObject:self.cellArray
forKey:@"cellArray"];
Я думаю, вы должны изменить это на следующее:
NSArray *array = [NSArray arrayWithArray:self.cellArray];
[[NSUserDefaults standardUserDefaults] setObject:array forKey:@"cellArray"];
Во-вторых, добавьте assert() после каждого места, где вы думаете, что у вас должен быть объект, т.е.
UIButton *theButton = ...
assert(theButton);
Вы также говорите, что количество строк в два раза больше числа cellArray, предположите, что это намеренно.