NSMutableArray removeObjectAtIndex: происходит сбой indexPath.row - PullRequest
3 голосов
/ 08 марта 2011

У меня есть UITableViewController с NSMutableArray в заголовке, как это:

NSMutableArray *someArray;

Также у меня объявлено свойство:

@property (nonatomic, retain) NSMutableArray *someArray;

В файле .m я загружаю массивв методе:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    someArray = [[NSMutableArray alloc] init];

    [self loadArrayData];

    [tableview reloadData];
}

Таблица заполняется отлично, добавление не вызывает проблем, но когда я пытаюсь удалить строку, приложение вылетает в следующей строке:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {

    [someArray removeObjectAtIndex:indexPath.row];

    //update table etc..

ЕслиЯ использую отладчик, я вижу, что в массиве есть некоторые объекты, и когда я регистрирую indexPath.row, я получаю значение, которое находится внутри размера массива.

Я не понимаю, почему в этой строке происходит сбой... Кто может мне помочь?

Консоль выводит:

* Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '- [__ NSArrayI removeObjectAtIndex:]: нераспознанный селектор отправлен на экземпляр 0x6193890 '

Ответы [ 3 ]

2 голосов
/ 19 октября 2012

У меня была очень похожая проблема, и я начинал свой массив с CoreData следующим образом:

self.allContacts = (NSMutableArray*)[cdc.managedObjectContext executeFetchRequest:fetchRequest error:&error];

пытается преобразовать результат запроса извлечения CoreDataController в NSMutableArray.

Оказывается, мне нужна функция "mutableCopy" в конце запроса на выборку.

self.allContacts = (NSMutableArray*)[[cdc.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];

Я не думаю, что приведение к (MutableArray *) обязательно, но у меня оно есть на всякий случай.

Надеюсь, это поможет.

1 голос
/ 08 марта 2011

У меня была такая же проблема неделю назад. Что я сделал, это было:

Объявлен NSMutableArray * globalArray как глобальный в том же файле реализации tableViewController.m. Тогда внутри

if (editingStyle == UITableViewCellEditingStyleDelete) {
   globalArray = [[NSMutableArray alloc] initWithArray:someArray];
   [globalArray removeObjectAtIndex:[indexPath row]]; 
}

А потом я скопировал этот глобальный массив в someArray перед вызовом reloadData. Работает.

0 голосов
/ 09 марта 2011
  1. не уверен, является ли это причиной одной из ваших проблем, но если у вас есть свойство для someArray, используйте self.someArray вместо someArray. Конечно, после использования self вы должны автоматически разблокировать его так:

self.someArray = [[[NSMutableArray alloc] init] autorelease];

(вызовите это внутри вашего viewController метод init)

затем попытайтесь:

[self.someArray removeObjectAtIndex:indexPath.row];

2. попробуйте позвонить [self loadArrayData]; внутрь viewDidLoad. Он должен вызываться до cellForRowAtIndexPath, и таким образом вам не нужно будет вызывать reloadData

если это все равно не поможет, тогда отправьте код loadArrayData

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...