Предупреждение перед удалением ячейки UITableView - (UIAlertController) Swift или Objective-C
Я хочу удалить ячейку представления таблицы, но прежде чем это произойдет, я хочу дать пользователю alertview. Я понял:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Warning"
message:@"Are you sure?"
delegate:self
cancelButtonTitle:@"NO"
otherButtonTitles:@"YES", nil];
[alert show];
[self.array removeObjectAtIndex:indexPath.row];//or something similar to this based on your data source array structure
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
if([title isEqualToString:@"Nee"])
{
NSLog(@"Nothing to do here");
}
else if([title isEqualToString:@"Ja"])
{
NSLog(@"Delete the cell");
}
}
но теперь, когда я провожу вправо по ячейке и появляется кнопка удаления, у меня нет AlertView. Я получаю AlertView только при нажатии на кнопку удаления. Когда я нажимаю кнопку "Удалить", появляется сообщение, но ячейка уже удалена.
Как сделать эту работу? Таким образом, есть AlertView, когда я кражу.
4 ответов
что касается последовательности, все нормально. commitEditingStyle
будет называться только тогда, когда кнопка уже была нажата. Дело в том, что вы на самом деле удаляете объект до того, как будет получено предупреждение. Измените его на это:
добавить к этому .файл м до @implementation
:
@interface PutYourViewControllerClassNameHere
@property (strong, nonatomic) NSIndexPath *indexPathToBeDeleted;
@end
и затем:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
self.indexPathToBeDeleted = indexPath;
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Warning"
message:@"Are you sure?"
delegate:self
cancelButtonTitle:@"NO"
otherButtonTitles:@"YES", nil];
[alert show];
// do not delete it here. So far the alter has not even been shown yet. It will not been shown to the user before this current method is finished.
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
// This method is invoked in response to the user's action. The altert view is about to disappear (or has been disappeard already - I am not sure)
NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
if([title isEqualToString:@"NO"])
{
NSLog(@"Nothing to do here");
}
else if([title isEqualToString:@"YES"])
{
NSLog(@"Delete the cell");
[self.array removeObjectAtIndex:[self.indexPathToBeDeleted row]];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:self.indexPathToBeDeleted] withRowAnimation:UITableViewRowAnimationFade];
}
}
Edit: это должно компилироваться, несмотря на незначительные синтаксические ошибки, вероятно. Общее assupmtion: Вы имеете дело только с одним разделом. По крайней мере, только с одной секции в исключения возможны.
iOS 8+
iOS 8 введен UIAlertController
. Это позволяет писать код удаления и отмены в блоках завершения, а не в методах делегирования (согласно -clickedButtonAtIndex
старого UIAlertView
).
Swift 3
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
let alertController = UIAlertController(title: "Warning", message: "Are you sure?", preferredStyle: .alert)
let deleteAction = UIAlertAction(title: "Delete", style: .destructive, handler: { (action) in
self.tableView.deleteRows(at: [indexPath], with: .fade)
})
alertController.addAction(deleteAction)
let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil)
alertController.addAction(cancelAction)
present(alertController, animated: true, completion: nil)
}
}
С
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Warning" message:@"Are you sure?" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *deleteAction = [UIAlertAction actionWithTitle:@"Delete" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}];
[alertController addAction:deleteAction];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"Don't do anything");
}];
[alertController addAction:cancelAction];
[self presentViewController:alertController animated:YES completion:nil];
}
}
вы вызываете предупреждение, когда действие удаления уже происходит....
положите его в:
-(void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Waarschuwing!"
message:@"Weet je zeker dat je het vak: lalaal wilt verwijderen?"
delegate:self
cancelButtonTitle:@"Nee"
otherButtonTitles:@"Ja", nil];
[alert show];
}
это вызовет предупреждение, когда ячейка будет прокручиваться и до нажатия кнопки.
iOS 9.0 и Swift 2.3
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
let alertController = UIAlertController(title: "Warning!", message: "You're about to delete this stuff right meow.", preferredStyle: .Alert)
let delete = UIAlertAction(title: "Do it.", style: .Destructive, handler: { action in
tableView.beginUpdates()
//delete from your datasource!
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
tableView.endUpdates()
})
let cancel = UIAlertAction(title: "Cancel", style: .Cancel, handler: { action in
//this is optional, it makes the delete button go away on the cell
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
})
alertController.addAction(delete)
alertController.addAction(cancel)
presentViewController(alertController, animated: true, completion: nil)
}
}