在iOS 7上选择后,UITableViewCell不会更新

时间:2014-10-18 02:39:48

标签: ios objective-c iphone uitableview

所以我有一个非常奇怪的问题。我的代码在iOS 8上运行良好但在iOS 7上没有用,我无法弄清楚原因。

我有一个tableview,其中包含一个项目列表,当您选择项目时,该项目会添加一个复选标记,如果再次选中该项目,则会删除复选标记。很简单吧? :-p就像我说它在iOS 8上运行得很好,但是当我在iOS 7.1上运行时,单元格突出显示,添加一个复选标记,并删除旧标题并将其替换为默认的标题。之后,无论我点击单元格多少次,它都不会改变(但基础数据确实会发生变化)。

选择之前 Before Selection

选择之后 After Selection

如果我离开屏幕并返回屏幕,则会正确显示行。我已经验证正在调用cellForRowAtIndexPath并且正在将值添加到单元格中。

- (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 [[parkFinderSingleton.data valueForKey:@"amenities"] count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"amenityFilterCell" forIndexPath:indexPath];

    Amenity *currentAmenity;
    NSArray *amenities = [parkFinderSingleton.data valueForKey:@"amenities"];


    if (amenities != nil) {
        currentAmenity = amenities[indexPath.row];
        cell.textLabel.text = currentAmenity.amenityTitle;
        NSLog(@"Cell Title %@", cell.textLabel.text);

        if (currentAmenity.amenitySelected) {
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        } else {
            cell.accessoryType = UITableViewCellAccessoryNone;
        }
    }

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"amenityFilterCell" forIndexPath:indexPath];

    Amenity *currentAmenity;
    NSArray *amenities = [parkFinderSingleton.data valueForKey:@"amenities"];

    if (amenities != nil) {
        currentAmenity = amenities[indexPath.row];

        if (currentAmenity.amenitySelected) {
            currentAmenity.amenitySelected = NO;
            cell.accessoryType = UITableViewCellAccessoryNone;
        } else {
            currentAmenity.amenitySelected = YES;
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        }
    }

    [self.tableView beginUpdates];
    [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
    [self.tableView endUpdates];

}

有关可能发生的事情的任何想法?

1 个答案:

答案 0 :(得分:2)

通常情况下,不应在dequeueReusableCellWithIdentifier:forIndexPath:中调用tableView: didSelectRowAtIndexPath:。如果您想要特定indexPath的单元格,请使用[tableView cellForRowAtIndexPath:indexPath]

对于:

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];

如果您只想取消选择单元格,请使用[tableView deselectRowAtIndexPath:animated:]