Удалите UITableViewCell с помощью пользовательского UIButton - PullRequest
1 голос
/ 03 апреля 2012

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

* Завершение работы приложения из-за необработанного исключения «NSRangeException», причина: «* - [__ NSArrayM removeObjectAtIndex:]: индекс 1 за пределами [0 .. 0] '

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

Вот действие по удалению ячейки.

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.

1 Ответ

1 голос
/ 03 апреля 2012

Если вы устанавливаете 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

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

...