此代码将在使用reloadData刷新UITableView后恢复单元格选择:
NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
[self.tableView reloadData];
[self.tableView selectRowAtIndexPath:selectedIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
当我在TableView顶部添加新单元格时,此解决方案无效。在顶部添加单元格时如何保持选择?
答案 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
}
}