因此,选择当前位于UITableView中的行很容易。例如,要选择第一行:
[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]
animated:YES
scrollPosition:UITableViewScrollPositionNone];
假设我有一个数组作为表的数据源,并且数组计数大于tableview中显示的单元格数。如何让UITableView
滚动到数组中的索引,该索引超出了tableview中当前显示的内容?
我所要做的就是以编程方式复制用户在向下滚动表时用食指做什么。
我的特定表显示9行。我的阵列有20多个项目。当UIViewController
加载时,它会检索应该选择的行号(来自NSUserDefaults
中存储的整数)。但我发现如果整数值介于0和8之间,它只会滚动到正确的数组位置。如果它是9或更大,没有任何反应,我无法弄清楚如何使它响应这一点。我查看了所有UITableViewDelegate
方法,似乎没有人解决这个问题。
我一直在滚动和选择一个特定的行是这样的(例如任意选择第11行):
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:11 inSection:0]
atScrollPosition:UITableViewScrollPositionTop
animated:YES];
[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:11 inSection:0]
animated:YES
scrollPosition:UITableViewScrollPositionTop];
任何人都可以帮助我吗?我认为这并不困难,但我被困住了。
谢谢!
答案 0 :(得分:2)
因为您正在使用可重复使用的单元格而无法选择屏幕外的单元格。来自可见屏幕的单元格将在稍后使用,并不是所有100个单元格都被缓存,每个单元格负责每一行。这意味着他们已经或者不能拥有它。例如,假设您有第1行的单元格。当它离开屏幕时,在接下来的几个单元格中,它将被重用为单元格15或其他东西,如果它已经选择了属性,它仍将拥有它。这就像一份新工作,你在开始之前就得到了开发人员的办公桌 - 你可以把桌子上的垃圾拿来,但它也可以很干净。
我不会在你通过方法选择它们时选择它们,而是在你的cellForRowAtIndexPath中的if语句中选择它们。一些事情(添加评论):
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"Cell";
// When using method with forIndexPath you don't have to check for nil because you will always get cell
MyTableCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
MyObj *obj = [self.myArray objectAtIndex:indexPath.row];
cell.location.text = obj.location.location_description;
// other formatting, text display, image loading, etc.
if ([self.selectedObjects containsObject:obj]) {
// do some selecting stuff
} else {
// but don't forget to unselect because you can get already selected cell
}
return cell;
}
编辑:要选择不可见的单元格,请先滚动至该单元格,然后选择:
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
[self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionTop];
答案 1 :(得分:1)
尝试使用UITableViewScrollPositionBottom
代替UITableViewScrollPositionNone
即使用此代码
[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:10 inSection:0]
animated:YES
scrollPosition:UITableViewScrollPositionBottom];
答案 2 :(得分:1)
我想出来了。我的代码在viewDidLoad
中运行,这太早了。我需要将其移至viewDidAppear
。至少我知道我并没有失去理智。