UIAlertView для удаления основного объекта данных - PullRequest
0 голосов
/ 23 марта 2011

Я пытаюсь использовать alertView, чтобы предупредить пользователей о том, что они собираются удалить объект.Вот мой код:

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

if (editingStyle == UITableViewCellEditingStyleDelete) {

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Caution!"
                                                    message:@"Are you sure you want to delete this truck?"
                                                   delegate:self
                                          cancelButtonTitle:@"NO"
                                          otherButtonTitles:@"YES", nil];
    [alert show];
    [alert release];
}   }

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex == 1) {
    NSIndexPath *indexPath = [truckTableView indexPathForSelectedRow];
    NSManagedObjectContext *moc = [self.fetchedResultsController managedObjectContext];
    Truck *truck = [fetchedResultsController objectAtIndexPath:indexPath];

    [moc deleteObject:truck];

    NSError *error = nil;
    if (![moc save:&error]) {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
}
else    {
}}    

Вид предупреждения отображается правильно, если я нажимаю «НЕТ», исчезает и все хорошо.Если я нажимаю «ДА», приложение вылетает без отчета журнала, просто EXC_BAD_ACCESS.Из того, что я исследовал, возможно, что alertView освобождается перед удалением объекта?Это правильно?Если да, то как сохранить alertView до тех пор, пока удаление не будет обработано?спасибо за вашу помощь!

1 Ответ

0 голосов
/ 23 марта 2011

Скорее всего, это связано с тем, что [truckTableView indexPathForSelectedRow] равен нулю. И из-за этого грузовик тоже будет нулевым. И когда вы попытаетесь удалить «ноль объекта», deleteObject: выдаст исключение

Вы должны сохранить indexPath ячейки, которую вы хотите удалить, как переменную экземпляра.

Часто EXC_BAD_ACCESS происходит от доступа к освобожденному объекту, но не в этот раз. После того, как вы его показали, можно отключить оповещение.

...