Подтвердить что ты не робот

Попытаться вставить нулевой объект из объектов [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] '

Во всяком случае, есть ли здесь код, который мог бы вызвать этот крах? Я действительно хочу, чтобы эта функциональность работала в моем приложении, и я знаю, что я близок к ее исправлению, но я просто не уверен, что вызывает эту проблему.

Любые идеи?

4b9b3361

Ответ 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, предположите, что это намеренно.