目标C:取消选择Cell时切换UITableViewCell

时间:2015-09-20 10:30:28

标签: ios objective-c uitableview

我正在研究一个原型(我在Objective C上太绿了),它有一个带有两个不同自定义原型单元的tableview,每个单元都有自己的组件,布局和高度。预期的行为是,在选中时,行会展开并显示单元格类型b,之前选定的行将返回到以前的高度和单元格类型。

好的,所以我遇到的问题是我无法获得之前选择的行来更改它的单元格类型,高度工作正常所以我最终显示的是扩展单元格的较短版本但没有所需单元格类型的组件和布局,如果我滚动查看tableview并返回到先前所选行的位置,它将显示正确的单元格类型,就好像它没有刷新其余行一样。

这是tableView cellForRowAtIndexPath的代码:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *CellIdentifier;

    UITableViewCell *cell = nil;

    if(indexPath.row == self.selectedIndex){

        CellIdentifier = @"ExpandedCell";
        CollapsedCell *collapsedCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
        cell = collapsedCell;

    }else{

        CellIdentifier = @"LocationCell";
        LocationCell *locationCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

        locationCell.transparentBorder.layer.borderWidth = 5.0f;
        locationCell.transparentBorder.layer.borderColor = [UIColor colorWithRed:255/255 green:255/255 blue:255/255 alpha:0.7].CGColor;
        cell = locationCell;

    }

    BHPlace *currentPlace = self.data[indexPath.row];

    NSString *name = currentPlace.name;

    LocationCell *locationCell = (LocationCell*)cell;
    locationCell.nameLabel.text = name;

    cell.backgroundColor = [UIColor clearColor];

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    return cell;
}

这是我的didSelectRowAtIndexPath的代码:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    [self.tableView deselectRowAtIndexPath:[NSIndexPath indexPathForRow:self.selectedIndex inSection:0] animated:YES];

    [self.tableView beginUpdates];
    self.selectedIndex = (int)indexPath.row;
        NSArray *paths = @[indexPath];
        [self.tableView reloadRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationFade];

        [self.tableView endUpdates];
    [self goToMarker:self.data[indexPath.row]];
}

像往常一样,我确信这是一个简单的问题,而且有些事情我没有做对,但找不到合适的方法,

谢谢大家的时间

1 个答案:

答案 0 :(得分:1)

您只需要重新加载以前选择的行和新选择的行 -

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    NSMutableArray *paths=[NSMutableArray new];

    if (self.selectedIndexPath != nil) {
        [paths addObject:self.selectedIndexPath];
        [tableView deselectRowAtIndexPath:self.selectedIndexPath animated:YES];
    }

    [self.tableView beginUpdates];
    self.selectedIndexPath = indexPath;
    [paths addObject:indexPath];
    [self.tableView reloadRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationFade];
    [self.tableView endUpdates];
    [self goToMarker:self.data[indexPath.row]];
}

请注意,我已将您的int媒体资源更改为NSIndexPath * self.selectedIndexPath