#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:
Я думаю, это потому, что вы назначаете указатели, а не копируете объект.