UITableViewCell删除不使用正确的UITableViewRowAnimation

时间:2015-12-24 06:54:00

标签: ios uitableview

当一行被删除时,无论我传递什么动画值,它总是向左滑动。我希望它能像许多股票应用程序一样上滑。

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        self.tableData = [][[self.tableData mutableCopy] removeObjectAtIndex:indexPath.row] copy];

        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop];

    }
}

这是完整的tableview控制器代码,它有很多内容。这就是我最初没有发布的原因。

@interface FMListViewController ()
@property (strong) NSArray *currentLocations;
@property (assign) BOOL isEditing;
@end

@implementation FMListViewController

- (void)viewDidLoad {
    [super viewDidLoad]; 
    UISegmentedControl *viewType = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"List", @"Map", nil]];
    CGRect viewTypeRect = viewType.frame;
    viewTypeRect.size.width = 150.0f;
    viewType.frame = viewTypeRect;
    viewType.selectedSegmentIndex = 0;
    [viewType addTarget:self action:@selector(viewTypeChange:) forControlEvents:UIControlEventValueChanged];
    self.navigationItem.titleView = viewType;
    self.currentLocations = [[FMLocations sharedManager] allLocations];
    //watch for weather updates
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(weatherUpdated) name:@"weatherUpdated" object:nil];
    //watch for changes to saved locations
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(locationsUpdated) name:@"locationsUpdated" object:nil];
    self.isEditing = NO;

}

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

    // this UIViewController is about to re-appear, make sure we remove the current selection in our table view when swiping back occurs
    NSIndexPath *tableSelection = [self.tableView indexPathForSelectedRow];
    [self.tableView deselectRowAtIndexPath:tableSelection animated:NO];
    [self.navigationController setToolbarHidden:YES animated:NO];

}


- (void)viewTypeChange:(UISegmentedControl *)segControl{
    NSLog(@"change to map");
    [(FMNavController *)[self navigationController] changeViewType];
    segControl.selectedSegmentIndex = 0;

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)weatherUpdated{
    [self.tableView reloadData];
    [self.refreshControl endRefreshing];
}

- (void)locationsUpdated{
    if(self.isEditing){
        self.currentLocations = [[FMLocations sharedManager] savedLocations];
    }else{
        self.currentLocations = [[FMLocations sharedManager] allLocations];
    }
    [self.tableView reloadData];
}

#pragma mark - Table Editing Stuff
- (IBAction)toggleEditing:(id)sender{
    if(self.isEditing){
        self.isEditing = NO;
        self.currentLocations = [[FMLocations sharedManager] allLocations];
        [self.tableView reloadData];
        UIBarButtonItem *newRightItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(toggleEditing:)];
        self.navigationItem.rightBarButtonItem = newRightItem;
        [self.tableView setEditing:NO animated:YES];
    }else{
        self.isEditing = YES;
        self.currentLocations = [[FMLocations sharedManager] savedLocations];
        [self.tableView reloadData];
        UIBarButtonItem *newRightItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(toggleEditing:)];
        self.navigationItem.rightBarButtonItem = newRightItem;
        [self.tableView setEditing:YES animated:YES];
    }

}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    if(indexPath.row == 0 && [[FMLocations sharedManager] currentLocation] && !self.isEditing){
        return NO;
    }
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //add code here for when you hit delete
        NSMutableArray *newLocations;
        int arrayOffset = 0;
        if([[FMLocations sharedManager] currentLocation] && !self.isEditing){
            arrayOffset = -1;
        }
        newLocations = [[[FMLocations sharedManager] savedLocations] mutableCopy];
        int itemToRemove = (int)indexPath.row + arrayOffset;
        if(itemToRemove < 0 || itemToRemove > [newLocations count]){
            NSLog(@"invalid item to remove");
        }else{
            [newLocations removeObjectAtIndex:itemToRemove];
            [[FMLocations sharedManager] saveSavedLocations:[newLocations copy]];
            if(self.isEditing){
                self.currentLocations = [[FMLocations sharedManager] savedLocations];
            }else{
                self.currentLocations = [[FMLocations sharedManager] allLocations];
            }

            [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop];

        }
    }
}

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
    if(indexPath.row == 0 && [[FMLocations sharedManager] currentLocation] && !self.isEditing){
        return NO;
    }
    return YES;
}


- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
    NSMutableArray *editableLocations = [[[FMLocations sharedManager] savedLocations] mutableCopy];
    if(editableLocations && [editableLocations count] > sourceIndexPath.row && [editableLocations count] > destinationIndexPath.row){
        NSInteger fromIndex = sourceIndexPath.row;
        NSInteger toIndex = destinationIndexPath.row;

        id object = [editableLocations objectAtIndex:fromIndex];
        [editableLocations removeObjectAtIndex:fromIndex];
        [editableLocations insertObject:object atIndex:toIndex];
        [[FMLocations sharedManager] saveSavedLocations:[editableLocations copy]];
    }
}

#pragma mark - Refresh control action
- (IBAction)doRefreshTable:(id)sender{
    [[ForecastManager sharedManager] updateForecasts];
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    return [self.currentLocations count];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    //NSLog(@"getting cell");
    FMTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"FMLocationCell" forIndexPath:indexPath];
    NSDictionary *theLocation = [self.currentLocations objectAtIndex:indexPath.row];
    // Configure the cell...
    cell.locationLabel.text = [[theLocation objectForKey:@"name"] uppercaseString];
    WeatherObject *locationWeather = [[ForecastManager sharedManager] weatherObjectForLocation:[[theLocation objectForKey:@"id"] intValue]];
    [cell setCurrentTemp:locationWeather.currentTemp];

    [cell configureForecastViews:locationWeather.forecastObjects];
    [cell.weatherPreviewContainer setNeedsDisplay];
    return cell;
}



#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
    if([segue.identifier isEqualToString:@"showLocation"]){
        FMDetailViewController *detailController = [segue destinationViewController];
        NSDictionary *theLocation = [self.currentLocations objectAtIndex:self.tableView.indexPathForSelectedRow.row];
        detailController.navigationItem.title = [theLocation objectForKey:@"name"];
        detailController.detailLocation = theLocation;
    }

}

2 个答案:

答案 0 :(得分:0)

您可以尝试以下解决方案:

1)用下面的行替换你的行

[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop];

[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];

2)使用以下代码更改代码:

[self.tableView beginUpdates];
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
[self.tableView endUpdates];

希望这有帮助!

答案 1 :(得分:0)

请尝试 不要直接删除单元格,首先使用单元格高度为零。 NSIndexPath *deleteIndexPath; 在删除之前的代码下面

    [tbl beginUpdates];
    deleteIndexPath = indexPath;
    [tbl reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    [tbl endUpdates];

并在set hight方法中使用

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{    if (indexPath == deleteIndexPath) {
    return 0;
}
return 50;
}