Как использовать UIActionSheet для подтверждения удаления UITableViewCell - PullRequest
1 голос
/ 03 февраля 2012

У меня есть стандартная настройка CoreData / NSFetchedResultsController / UITableView. Вверху нет кнопки редактирования, но, проведя вправо по строке, вы увидите кнопку удаления. Если кнопка удаления нажата, я хочу открыть UIActionSheet, чтобы подтвердить удаление.

До UIActionSheet я только что реализовал tableView:commitEditingStyle:forRowAtIndexPath:, и в нем я вызвал deleteObject: для managedObjectContext для indexPath и позволил переопределениям FetchedResultsController обработать его визуальный аспект.

Теперь я tableView:commitEditingStyoe:forRowAtIndexPath: создаю UIActionSheet и показываю его. Я реализовал actionSheet:clickedButtonAtIndex: и поместил deleteObject: в случае, когда нажата кнопка удаления. Проблема в том, что мне нужен indexPath элемента для удаления, и он больше не находится в области действия.

Должен ли я ...

A) удалить ManagedObject в tableView:commitEditingStyle:forRowAtIndexPath: и либо сохранить, либо откатить в actionSheet:clickedButtonAtIndex:?

B) сохранить путь индекса как свойство, чтобы я мог установить его в tableView:commitEditingStyle:forRowAtIndexPath: и прочитать его в actionSheet:clickedButtonAtIndex:?

в) что-то еще ...

Опция A выглядит как дополнительная нагрузка, чем необходимо. В любом случае он будет удален, просто иногда он будет отменен.

Вариант B выглядит очень агрессивно. Такое внешнее значение не очень подходит для объектно-ориентированной модели.

Есть ли в UIActionsSheet универсальный объект для передачи таких значений? Или я что-то пропустил?

Ответы [ 2 ]

0 голосов
/ 16 июля 2012

Вместо indexPath я бы сохранял сам управляемый объект в свойстве в -tableView:commitEditingStyle:forRowAtIndexPath: метод:

self.deleteCandidate = [self.controller objectAtIndexPath:indexPath]

, а затем удалял этот объект (или нет) в -actionSheet:clickedButtonAtIndex: и устанавливал быself.deleteCandidate = nil в любом случае.

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

Другой вариант - использовать «Ассоциативные ссылки» (objc_setAssociatedObject, objc_getAssociatedObject) для сохранения ссылки из UIActionSheet на рассматриваемый объект.

0 голосов
/ 17 февраля 2012

Мне нужно было подобное решение. Я решил это, создав ivar NSIndexPath * currentPath; и использовал следующую идею для tableView:commitEditingStyle:forRowAtIndexPath:

- (void) tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIAlertView     * alert;
    UITableViewCell * cell;
    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        // save current indexPath
        [currentPath release];
        currentPath = [indexPath retain];

        // display warning
        alert = [[UIAlertView alloc] initWithTitle:@"Really?"
                message:@"Are you really really sure you want to delete this item?"
                delegate:self
                cancelButtonTitle:@"Cancel"
                otherButtonTitles:@"Delete", nil];
        [alert show];
        [alert release];

        // clear delete confirmation from table view cell
        cell = [tableView cellForRowAtIndexPath:indexPath];
        [cell setEditing:NO animated:NO];
        [cell setEditing:YES animated:YES];
     };
     return;
  }

Если пользователь нажимает кнопку удаления, я затем удаляю строку из UITableViewCell и удаляю запись из источника данных. Если они нажимают «Отмена», я просто игнорирую действие.

...