UITableView:在顶部添加单元格时保持选择(单选)?

时间:2016-02-18 13:15:27

标签: ios objective-c uitableview selection reloaddata

此代码将在使用reloadData刷新UITableView后恢复单元格选择:

NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
[self.tableView reloadData];
[self.tableView selectRowAtIndexPath:selectedIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone];

当我在TableView顶部添加新单元格时,此解决方案无效。在顶部添加单元格时如何保持选择?

4 个答案:

答案 0 :(得分:1)

这实际上取决于您的数据源。对于简单情况最常见的例子,如果它是一个数组,那么你可以记住"每次选择一行(tableView:didSelectRowAtIndexPath:

时,该对象
myObjecyt = [myArray objectAtIndex:indexPath.row];

,在[table reloadData];之后,选择表索引:

NSUInteger index = [myArray indexOfObject:myObject];
if (index != NSNotFound) {
    NSINdexPath *selectedIndexPath = [NSIndexPath indexPathForRow:index inSection:0];
    [self.tableView selectRowAtIndexPath:selectedIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone];

}

但是,正如我所说,它实际上取决于很多因素,这只是基本设置的一个示例,其中表格填充了myArray的数据,没有重新排列和省略项目(并且只有一节)。

答案 1 :(得分:0)

您可以简单地跟踪您在顶部添加的单元格数量,并根据该值增加您使用selectRowAtIndexPath:选择的行的索引。

或者,如果您有任何类型的UI元素(UIButton,UILabel等),那么您可以在didSelectRowAtIndexPath:中设置该元素的标记,然后访问具有该标记的元素的单元格(重新加载后)使用像UITableViewCell *selectCell = (UITableViewCell *)[[self.view viewWithTag:100] superview];

这样的东西

答案 2 :(得分:0)

试试这个:

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if([indexPath row] == ((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject]).row){
        //end of loading

       int anyIndex = <any number of cell>
       NSIndexPath *anyIndexPath = [[NSIndexPath alloc] indexPathForRow:anyIndex inSection:0];
       UITableViewCell *anyCell = [table cellForRowAtIndexPath: firstIndexPath]
       anyCell.selectionStyle = UITableViewCellSelectionStyle.Default

    }
}

这应该有用。

答案 3 :(得分:0)

正如@Frane Poljak所说,用户点击tableView表示该行中包含的对象是用户感兴趣的。您必须将对象保留为引用,以再次选择包含它的单元格。

假设你有一个Object数组,你可以这样做

enum Value
{
    case NotSelected
    case Selected(object)
}

private var selectionState : Value = .NotSelected

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    selectionState = Selected(dataSource[indexPath.row])
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    [...]
    switch selectionState {
    case .Selected(let object as! Object):
        if dataSource[indexPath.row] == object { cell.selected = true } 
        else { cell.selected = false }
    default : cell.selected = false
    }
}