Удалить строку таблицы и одновременно объект из основных данных одной кнопкой

У меня есть базовая модель данных с отдельными объектами. Затем я загружаю эти объекты в массив и отображаю их в таблице со стилями ячеек по умолчанию. На панели навигации есть кнопка удаления, которая при выборе строки (например, объекта) и нажатии этой кнопки должна удалить строку и соответствующий объект в базовой модели. Я видел примеры удаления строк, но с кнопкой удаления, отображаемой в каждой строке. Я хочу иметь только одну кнопку в навигационной панели и иметь возможность управлять удалением строк из нее. Я пробовал код ниже, но он не работает. Я не могу найти способ идентифицировать строку, выбранную в методе удаления. Любая помощь приветствуется.

В viewdidload класса tableviewcontroller:

 UIBarButtonItem *delButton = [[UIBarButtonItem alloc]
                                  initWithTitle:@"Del"
                                  style: UIBarButtonItemStyleBordered
                                  target: self
                                  action:@selector(delItemToArray)];


self.managedObjectContext = ((ecoAppDelegate *) [UIApplication sharedApplication].delegate).managedObjectContext;



NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"FavoritesInfo" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

fetchRequest.resultType = NSDictionaryResultType;

[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"name", nil]];



  NSError *error=nil;

self.favArr=[self.managedObjectContext executeFetchRequest:fetchRequest error:&error];


if (error!=nil) {
    NSLog(@" fetchError=%@,details=%@",error,error.userInfo); 
}


self.favName = [self.favArr valueForKey:@"name"];




//Delete Item To table array and delete object to data core model

    - (void)delItemToArray {

        AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

        NSManagedObjectContext *context = [appDelegate managedObjectContext];

        [context deleteObject:appDelegatee.favoritesInfo]; // favoritesInfo is the NSManagedObject

        NSIndexPath *indexPath;
        [favName removeObjectAtIndex:indexPath.row];

        [appDelegatee saveContext]; // to save changes in the core data model

        [self.tableView reloadData];
    }

Ошибка:

  [__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x8852b90
    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x8852b90'

person user3211165    schedule 15.07.2014    source источник
comment
Вы пытаетесь удалить объект из неизменяемого массива (__NSArrayI). Можете ли вы показать декларацию favName   -  person Dimitris Bouzikas    schedule 15.07.2014
comment
@dimimpou Данные моей таблицы заполняются из неизменного массива. Должен ли я изменить его на NSArray, он показывает эту ошибку. Нет видимого @interface для NSArraydeclares селектора removeObjectatIndex.   -  person user3211165    schedule 15.07.2014
comment
Измените свою декларацию с NSArray на NSMutableArray. А также, когда вы инициализируете массив, вы должны использовать этот favName = [NSMutableArray array];   -  person Dimitris Bouzikas    schedule 15.07.2014


Ответы (1)


Вы можете получить предупреждение типа Incompatible pointer types initializing 'NSMutableArray *' with an expression of type 'NSArray *' здесь

self.favArr=[self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

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

self.favArr  = [[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];

Также измените это

self.favName = [self.favArr valueForKey:@"name"];

to

self.favName = [[self.favArr valueForKey:@"name"]mutableCopy];
person Johnykutty    schedule 15.07.2014
comment
Это работает, но когда я создаю изменяемые копии, то изменения, которые я делаю, попадают в копии, а не в исходные. В результате результаты не будут правильно сохранены в массиве. Как я могу это исправить - person user3211165; 15.07.2014
comment
поскольку вы удаляете объект из контекста, например [context deleteObject:appDelegatee.favoritesInfo];. он будет удален из базы данных, если вы вызовете saveContext - person Johnykutty; 16.07.2014