Просмотр таблицы контроллера cs193p iTunesU 9 урок

Здравствуйте, я изучаю 9-й урок iTunesU CS193P о табличном представлении, и компилятор сообщает мне об этой ошибке NSInternalInconsistencyException', причина: '-[__NSCFArray removeObjectAtIndex:]: метод мутации отправлен в неизменный объект '

мой симулятор это iPad 6.1

так что я

класс с именем GraphViewController.m

#define FAVORITE_KEY @"GraphViewController.Favorite"
- (IBAction)addFavorite:(id)sender
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSMutableArray *favorites = [[defaults objectForKey:FAVORITE_KEY] mutableCopy];
    if (!favorites) favorites = [NSMutableArray array];
    [favorites addObject:self.program];
   // NSLog(@"contenuto favorites %@",favorites);
    [defaults setObject:favorites forKey:FAVORITE_KEY];
    [defaults synchronize];
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"GraphTableView"]) {
        NSArray *program = [[NSUserDefaults standardUserDefaults]objectForKey:FAVORITE_KEY];
        [segue.destinationViewController setPrograms:program];
    }
}

(setPrograms - это установщик, в котором у меня есть данные для отправки на моем контроллере таблиц, называемом CalculatorTVC.m)

класс под названием CalculatorTVC.m

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.programs count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"cellTable";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell...
    id program = [self.programs objectAtIndex:indexPath.row];

    cell.textLabel.text = [@"y = " stringByAppendingString:[CalculatorBrain descriptionProgram:program]];
    NSLog(@"contenuto di program %@",program);  

    return cell;
}

(программы - это публичное свойство, куда я помещаю данные из GraphViewController.m)

В моей раскадровке у меня есть разделенное представление... в MasterViewController у меня есть панель инструментов с элементом панели кнопок, подключенным к контроллеру табличного представления (CalculatorTVC.m), в идентификаторе стиля поповера - GraphTableView, и у меня есть круглая прямоугольная кнопка, которая является addFavorite, описать здесь

ошибка * Нагрузочное приложение из - за неперехваченное исключение 'NSInternalInconsistencyException', причина: '- [__ NSCFArray removeObjectAtIndex]: метод мутирует отправлен неизменный объект' * Первый стек бросить вызов: (0x1ca1012 0x10dee7e 0x1ca0deb 0x1d21c4f 0x1d21911 0x4a5b 0x8f65 0xdd8fb 0xdd9cf 0xc61bb 0xd6b4b 0x732dd 0x10f26b0 0x229dfc0 0x229233c 0x22a0238 0x6b6e3 0x4f1476 0x870989a 0x4f2555 0x489ef9 ​​0x46ab99 0x46ac14 0x10f2705 0x262c0 0x262a64 0x10f2705 0x262c0 0x26258 0xe7021 0xe757f 0xe66e8 0x55cef 0x55f02 0x33d4a 0x25698 0x1bfcdf9 0x1bfcad0 0x1c16bf5 0x1c16962 0x1c47bb6 0x1c46f44 0x1c46e1b 0x1bfb7e3 0x1bfb668 0x22ffc 0x24bd 0x23e5) LibC++abi.dylib: Terminate называется бросать исключение (lldb)

Помогите мне, пожалуйста

спасибо за ваше терпение


хорошо, я нахожу, где это падает....

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"cellTable";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell...
    id program = [self.programs objectAtIndex:indexPath.row];

    cell.textLabel.text = [@"y = " stringByAppendingString:[CalculatorBrain descriptionProgram:program]];
    NSLog(@"contenuto di program %@",program);  

    return cell;
}

авария на линии

cell.textLabel.text = [@"y = " stringByAppendingString:[CalculatorBrain descriptionProgram:program]];

если я ставлю NSLOG перед этой строкой, я вижу в выводе результат NSLOG... но если я ставлю NSLOG после этого, я ничего не вижу в выводе

1 ответ

 NSArray *program = [[NSUserDefaults standardUserDefaults]objectForKey:FAVORITE_KEY];
[segue.destinationViewController setPrograms:program];

Здесь вы передаете неизменяемый массив в контроллер представления назначения. Если он ожидает изменяемый массив и пытается его изменить, вы получите этот сбой. Вам также нужна изменяемая копия.

Если свойство должно быть изменяемым массивом, вы должны получить предупреждения компилятора. Не игнорируйте это!

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

Другие вопросы по тегам