以编程方式选择表格视图单元格:selectRowAtIndexPath vs setSelected

Posted

技术标签:

【中文标题】以编程方式选择表格视图单元格:selectRowAtIndexPath vs setSelected【英文标题】:Select a table view cell programmatically: selectRowAtIndexPath vs setSelected 【发布时间】:2013-02-17 10:57:26 【问题描述】:

我经常需要将表格视图单元格设置为初始选定状态,为此我使用以下代码:

[self.tableView selectRowAtIndexPath:indexPath 
   animated:NO scrollPosition:UITableViewScrollPositionNone];
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:YES];
cell.accessoryType = UITableViewCellAccessoryCheckmark;

我同时使用selectRowAtIndexPath:indexPathsetSelected:YES,因为我不完全理解这两种方式中哪一种是以编程方式选择单元格的首选方式。

我应该使用哪一种陈述以及为什么?

【问题讨论】:

【参考方案1】:

我相信您要使用的方法是selectRowAtIndexPath:animated:scrollPosition:。通常,您应该将单元状态的管理留给表格视图。在选择的情况下,它存储并维护一组选定的索引路径,因此在为它重用不同的单元格后,正确的行将保持选中状态。也不需要调用这两个方法,这只是多余的。

【讨论】:

谢谢你,@Nicky!使用selectRowAtIndexPath:animated:scrollPosition: 后,我会重新加载表格并根据单元格的选择状态(isSelected)在cellForRowAtIndexPath 中设置复选标记? 嗯,我通常将选中的项目存储在一个单独的属性中,感觉更明确。因此,在tableView:didSelectRowAtIndexPath: 中,您执行以下操作:重新加载两行,之前选中的一行,用户点击的一行(没有动画),选择点击的行(也没有动画),然后取消选择它的动画,这样您就可以看到漂亮的视觉效果影响。所有这些都是通过调用 table view 的方法来完成的。 需要额外的选择,因为重新加载后单元格会丢失它。您可以在那里设置附件类型并且无需重新加载/选择就可以了,尽管我不想复制单元配置逻辑的任何部分。谁知道呢,也许明天我会使用花哨的自定义复选标记或其他一些疯狂的东西:)【参考方案2】:

就我而言

let indexPath = IndexPath(item: viewModel.item, section: viewModel.section)

self.categoryCollectionView.selectItem(at: indexPath, animated: true, scrollPosition: UICollectionView.ScrollPosition.centeredHorizontally)

if let cell = self.categoryCollectionView.dequeueReusableCell(withReuseIdentifier: SubcategoryCollectionViewCell.identifier, for: indexPath) as? SubcategoryCollectionViewCell 
    //...//

【讨论】:

以上是关于以编程方式选择表格视图单元格:selectRowAtIndexPath vs setSelected的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式选择单元格并转到 tabbarcontroller

如何以编程方式关闭展开的表格视图单元格?

以编程方式将按钮添加到表格视图单元格[关闭]

动态表格视图单元格,以编程方式更改子视图高度

如何以编程方式使用原型单元格删除表格视图部分标题

以编程方式向表格视图单元格添加按钮[关闭]