проблемы с UIAlertView и удаление элемента из моего tableview

#iphone #uitableview #ios5 #uialertview

#iPhone #uitableview #ios5 #uialertview

Вопрос:

Я хочу включить UIAlertView-запрос, прежде чем пользователь сможет удалить элемент из моего tableview. Но indexPath, похоже, равен «нулю»…

Это мой код:

Заголовочный файл выглядит следующим образом..

     @interface ReturnRootViewController : UITableViewController <NSFetchedResultsControllerDelegate> {
    // ..
        NSIndexPath                 *deleteSelectedRow;     
    }

    // ..
    @property (nonatomic, retain) NSIndexPath                   *deleteSelectedRow;

    @end
  

.. файл реализации выглядит следующим образом..

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

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        NSUserDefaults *setting = [NSUserDefaults standardUserDefaults];
        [setting synchronize];

        // for the UIAlert-View handling:
        deleteSelectedRow = indexPath;

        if ([setting boolForKey:@"delete_preference"]) {

            // Sicherheitsabfrage vor dem Löschen
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Achtung", @" ")
                                                            message:NSLocalizedString(@"Sind Sie sicher, dass Sie den Eintrag löschen wollen?", @" ")
                                                           delegate:self
                                                  cancelButtonTitle:NSLocalizedString(@"Nein", @"Nein")
                                                  otherButtonTitles:NSLocalizedString(@"Ja", @"Ja"), nil];
            [alert show];
            [alert release];


        } else {
          // just the case you override the settings
            [moc deleteObject:[fetchedResultsController objectAtIndexPath:deleteSelectedRow]];

            NSError *error = nil;
            if (![moc save:amp;error]) {
                NSLog(@"Ungelöstes Problem %@, %@", error, [error userInfo]);
                abort();
            }
        }

    }   
}
  

и последнее, но не менее важное, метод для обработки uialertview:

 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex == 1) {

        // Delete request
        [moc deleteObject:[fetchedResultsController objectAtIndexPath:deleteSelectedRow]];
// ..
  

и это то место, где происходит сброс моего приложения! Значение deleteSelectedRow равно нулю.
кстати: значение deleteSelectedRow не равно нулю в инструкции else из метода tableview:commitEditingStyle! Я полностью беспомощен.

До iOS 5 это работало подобным образом…

Спасибо за любые подсказки. ifeelhorst

Ответ №1:

Как и сейчас, indexPath может быть выпущен к моменту нажатия / возврата режима предупреждения. Изменить

 deleteSelectedRow = indexPath;
  

Для

 self.deleteSelectedRow = indexPath; // to retain it
  

или (чтобы сделать его копию)

 self.deleteSelectedRow = [[indexPath copy] autorelease]; 
  

Это не объясняет, почему оно равно нулю, однако попробуйте поставить точку останова в этой строке и в обратном вызове alert view clickedButtonAtIndex , чтобы посмотреть, что произойдет.

Ответ №2:

Я думаю, это потому, что вы назначаете указатели, а не копируете объект.