2012-04-03 4 views
1

Я столкнулся с этой ошибкой при попытке удалить ячейку с помощью настраиваемой кнопки.Удалить UITableViewCell с помощью пользовательского UIButton

* Нагрузочный приложение из-за неперехваченного исключением 'NSRangeException', причина: '* - [__ NSArrayM removeObjectAtIndex]: индекс 1 за пределами [0 .. 0]

Вот как мой код структурирован. У меня есть пользовательский UITableViewCell, который содержит UIButton, у которого есть действие, которое удаляет ячейку. Действие для удаления ячейки находится в моем основном контроллере View, который содержит фактические indexPath для ячеек. Эта структура отлично работает.

Heres действие для удаления ячейки.

NSIndexPath *indexPath = [self globalIndexPath]; 

[self.array removeObjectAtIndex:[indexPath row]]; 
[db deleteTaskAtIndex:[indexPath row]]; 

[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath,nil] withRowAnimation:UITableViewRowAnimationFade]; 

Когда я объявляю выше indexPath, свойство globalIndexPath устанавливается в моей cellForRowAtIndexPath, придавая ему значение исходной indexPath. Вот как я это объявил.

[self setGlobalIndexPath:indexPath]; 

Теперь я положил некоторые NSLogs здесь там регистрировать indexPath. Например, в методе viewWillAppear и методе viewDidLoad, и оба дают мне точный indexPath, и я даже проверил выходы array, и все они возвращают точные результаты, поэтому я действительно не знаю, почему это дает мне ошибку.

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

NSArray *notificationArray = [[UIApplication sharedApplication] scheduledLocalNotifications]; 
if (!notificationArray || !notificationArray.count) 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"DeleteSignal" object:nil]; 
} 
else 
{ 
    UILocalNotification *notif = [notificationArray objectAtIndex:[checkbox tag]]; 
    [[UIApplication sharedApplication] cancelLocalNotification:notif]; 
} 

А потом удалить ячейки с помощью NSNotificationCenter с ключом DeleteSignal.

+0

Попробуйте установить точку останова, когда [indexPath row] is = = [self.array count] перед каждым удалением ...или утверждать, что строка меньше, чем count. Кроме того, любой шанс, что вы удаляете несколько элементов без обновления таблицы? –

+0

Я попробую точку останова, но Да, я попытался перезагрузить мой «tableView» в своих «viewDidLoad» и «viewWillAppear». – Souljacker

+0

Я сделал инструкцию if перед и после моих функций удаления и поместил журнал, но я точно не знаю, как это будет работать. – Souljacker

ответ

1

Если вы устанавливаете globalIndexPath в cellForRowAtIndexPath (и нигде больше), globalIndexpath всегда будет знать indexPath для последней ячейки, которые получили созданные или, из очереди не тот, в котором пользователь может фактически использовать кнопку. Кажется, уже разбит дизайн. Или ваши клетки настолько большие, что только один виден?

Сначала я хотел бы попробовать установить тег вашего UIButton вашей ячейки в cellForRowAtIndexPath

myButton.tag = indexPath.row + SOMEOFFSETTOASSUREYOURTAGDOESNTGET0; 

, а затем получить indexPath в своем действии с помощью этого тега:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:(UIButton*)sender.tag - OFFSET inSection:0]; 

Конечно, это только работает, если у вас есть только один раздел. Если вам нужно обрабатывать несколько разделов, вы можете использовать массив, который содержит все ваши indexPaths, и установить тег вашего UIButton индексу этого indexPath в вашем массиве.

UPDATE

Хотя это технически возможно (MIS) использовать NSNotificationCenter для того, что вы делаете, я действительно советую вам пройти через эту tutorial.

+0

мое действие находится в главном контроллере представления, и это просто «пустота». Ваш код для объявления 'indexPath' возвращает ошибку, поскольку отправитель не объявлен. Предполагается, что это моя кнопка? – Souljacker

+0

Вы определили протокол и используете делегат в своем пользовательском 'UITableViewCell' для вызова этого действия? –

+0

И да, отправитель должен быть вашим UIButton. –

Смежные вопросы