以编程方式选择不在当前视图中的UITableView单元

时间:2015-10-27 23:07:02

标签: ios objective-c arrays uitableview

因此,选择当前位于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];

任何人都可以帮助我吗?我认为这并不困难,但我被困住了。

谢谢!

3 个答案:

答案 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。至少我知道我并没有失去理智。