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

Posted

技术标签:

【中文标题】以编程方式选择不在当前视图中的 UITableView 单元格【英文标题】:Programmatically select UITableView cell not in current view 【发布时间】:2015-10-27 23:07:01 【问题描述】:

因此很容易选择当前在 UITableView 中的行。例如,选择第一行:

[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]
                                animated:YES
                          scrollPosition:UITableViewScrollPositionNone];

假设我有一个数组作为表格的数据源,并且数组计数大于表格视图中显示的单元格数。如何让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];

谁能帮帮我?我认为这并不难,但我被困住了。

谢谢!

【问题讨论】:

您是否正在为特定 indexPath 出列单元格?你是自己创造的吗?显示一些代码:) 我刚刚发布了我认为会显示我在做什么的代码。你对我的问题是问我问题的更好方法:如何将单元格入队/出队,以便我可以在 UITableView 中显示我的数组中的新子集?这就是我不知道该怎么做。谢谢! 为什么要选择一个不在屏幕上的单元格?如果您知道要选择哪个单元格,您就知道对该选择执行什么操作,并且由于该操作不是 UI(因为单元格不在视图中),因此只需执行该操作。 我不想选择不在屏幕上的单元格。我希望我的屏幕将正在显示的数据更新为来自当前不在显示中的数组位置。例如,如果我的表格从显示数组位置 0-8 的单元格开始,也许我想更新它以显示数组位置 11-19。这有意义吗? 【参考方案1】:

您不在屏幕上的单元格没有选择,因为您使用的是可重复使用的单元格。可见屏幕中的单元格将在稍后使用,并不是所有 100 个单元格都被缓存并且每个单元格负责每一行。这意味着他们已经可以或不可以拥有某些东西。例如,假设您有第 1 行的单元格。当它离开屏幕时,在接下来的几个单元格中,它将被重新用作单元格 15 或其他内容,如果它已选择属性,它仍然会有它。这就像一份新工作,你从开发人员那里得到了一张桌子——你可以有一张桌子放着他的垃圾,但它也可以是干净的。

我不会像您通过方法选择它们一样选择它们,而是在您的 cellForRowAtIndexPath 中的 if 语句中选择它们。类似的东西(添加了 cmets):

- (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];

【讨论】:

谢谢。我理解这个概念(或多或少),但我仍在努力如何执行它。 selectedObjects 是什么? 我的 if 只是一个占位符,因为我不知道你的整个结构。您可以拥有选定单元格的索引,或者对象数组。我使用了对象数组的版本-在这里我们检查是否应该选择单元格-然后相应地对其进行样式设置或做一些准备或其他任何事情-在这里进行,因为当单元格可见时,将触发该方法。 我还是一头雾水。我的表格视图只允许选择一个单元格,我并不特别关心之前选择了哪个单元格。例如,假设UIViewController 加载并希望从顶部单元格 (0) 中数组位置 11 中的对象开始“选择”(即显示)表格,单元格 1-8 显示数组位置中的对象12-19。我仍然不知道该怎么做。抱歉,我很抱歉,但我只是不明白我需要做什么才能实现这一目标。 这正是我一直在做的!不幸的是,它不起作用。这比它应该的要复杂得多。感谢您所有的帮助。我很感激!【参考方案2】:

尝试使用UITableViewScrollPositionBottom 而不是UITableViewScrollPositionNone

即使用此代码

[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:10 inSection:0]
                                animated:YES
                          scrollPosition:UITableViewScrollPositionBottom];

【讨论】:

谢谢,但没有任何改变。 为了在顶部显示 11 个数组元素,您可以尝试将 tableview 滚动到该特定索引为 [_mainTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];【参考方案3】:

我想通了。我的代码在viewDidLoad 中运行,这还为时过早。我需要把它移到viewDidAppear。至少我知道我没有失去理智。

【讨论】:

以上是关于以编程方式选择不在当前视图中的 UITableView 单元格的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 8 中以编程方式将视图中的按钮居中使用约束

从 CollectionView Cell 以编程方式执行 Segue

以编程方式选择表格视图中的所有单元格,以便下次按下它们时调用 didDeselect

Swift - 以编程方式从集合视图中选择第一个项目

选择 Drawable 以编程方式显示在图像视图上

如何以模态方式将视图添加到不在视图层次结构中的另一个视图 iOS