问题与UIAlertView和删除项目从我的表视图



我想在用户可以从我的表视图中删除一个项目之前启用一个UIAlertView-Request。但是indexPath似乎是"nil"…

这是我的编码:

头文件看起来像这样…
    @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:&error]) {
                NSLog(@"Ungelöstes Problem %@, %@", error, [error userInfo]);
                abort();
            }
        }
    }   
}

最后但并非最不重要的是uialertview-handling的方法:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex == 1) {
        // Delete request
        [moc deleteObject:[fetchedResultsController objectAtIndexPath:deleteSelectedRow]];
// ..

,那是我的应用程序转储的地方!deleteSelectedRow为nil 顺便说一下:deleteeselectedrow在tableview: commiteditingstyle -方法的else-Statement中不是nil !我完全没有办法。

在iOS 5之前,它是这样工作的…

谢谢你的提示。ifeelhorst

就像现在一样,indexPath可以在单击/返回警报视图时被释放。把

deleteSelectedRow = indexPath;

self.deleteSelectedRow = indexPath; // to retain it

或(复制)

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

这并不能解释为什么它是nil,但是,尝试在该行和警告视图clickedButtonAtIndex回调上放置一个断点,看看会发生什么。

我认为这是因为你在分配指针而不是复制对象。

最新更新