tableView:didDeselectRowAtIndexPath: 直到第一次用户启动的选择和取消选择才被调用

Posted

技术标签:

【中文标题】tableView:didDeselectRowAtIndexPath: 直到第一次用户启动的选择和取消选择才被调用【英文标题】:tableView:didDeselectRowAtIndexPath: not called until first user-initiated selection and deselection 【发布时间】:2013-07-01 15:27:26 【问题描述】:

我有一个UITableView,有四个单元格,处于单选模式。首次加载视图时,我根据存储的首选项使用-selectRowAtIndexPath:animated:scrollPosition: 以编程方式选择其中一个单元格。在此之后,用户可以与表格进行交互。

每次用户点击任何单元格时,都会在我的表格视图委托上调用 -tableView:willSelectRowAtIndexPath:-tableView:didSelectRowAtIndexPath: 方法。但是,-tableView:willDeselectRowAtIndexPath:-tableView:didDeselectRowAtIndexPath:(即 DEselect)在用户手动点击第一个以编程方式选择的单元格之前不会开始被调用。

知道为什么会发生这种情况吗?除了为每个单元格手动调用-[UITableView selectRowAtIndexPath:animated:] 之外,是否还有其他解决方法,用户点击的单元格除外?

【问题讨论】:

您试图在选择UITableViewCell 后立即取消选择它? 不完全。以编程方式选择一个单元格(称为 cellA)。我希望用户能够通过点击另一个单元格来取消选择 cellA,但实际上这在用户实际点击 cellA 自己之前不起作用。 是的,我遇到了同样的问题。您需要调用selectRowAtIndexPath:animated:scrollPosition: 方法将状态设置为选中。检查我的答案***.com/a/44097559/1600061 【参考方案1】:

如果您过早调用 [UITableView selectRowAtIndexPath:animated:] 并且您正在使用 UITableViewController,您可能与 UIViewController clearsSelectionOnViewWillAppear 发生冲突(默认为 YES)。尝试设置 self.clearsSelectionOnViewWillAppear = NO;在你的 viewDidLoad

【讨论】:

【参考方案2】:

评论太长了,所以我将其发布为答案。

刚刚使用 tableView 创建了测试项目。我在viewDidLoad 上调用[UITableView selectRowAtIndexPath:animated:],我选择了一个单元格。然后我选择另一个单元格(不取消选择第一个单元格)。

我有这个输出:

[SDTVTViewController tableView:willSelectRowAtIndexPath:]    
[SDTVTViewController tableView:willDeselectRowAtIndexPath:]    
[SDTVTViewController tableView:didDeselectRowAtIndexPath:]    
[SDTVTViewController tableView:didSelectRowAtIndexPath:]

我取消选择了第一个单元格并选择了第二个单元格。

我不知道为什么它在您的代码中不起作用。当您调用[UITableView selectRowAtIndexPath:animated:] 时,您可以发布您已实现的UITableViewDelegate 方法的代码吗?

【讨论】:

【参考方案3】:

我正在打包我的初始数据源更新和-selectRowAtIndexPath:... 调用

[_tableView beginUpdates];
// ...
[_tableView endUpdates];

显然,就像-reloadData 一样,这会清除当前选择(不确定这是否是设计使然)。我将调用 -selectRowAtIndexPath:... 移到 -endUpdates 之后,现在一切正常。

【讨论】:

以上是关于tableView:didDeselectRowAtIndexPath: 直到第一次用户启动的选择和取消选择才被调用的主要内容,如果未能解决你的问题,请参考以下文章