tableView:didDeselectRowAtIndexPath:在第一次用户启动的选择和取消选择之前不会被调用

时间:2013-07-01 15:27:27

标签: ios cocoa-touch uitableview

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

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

评论时间过长,所以我将此作为答案发布。

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

我有这个输出:

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

我取消选择第一个单元格,然后选择第二个单元格。

我不知道,为什么它不适用于您的代码。当您致电[UITableView selectRowAtIndexPath:animated:]时,您是否可以发布已实施的UITableViewDelegate方法代码?

答案 2 :(得分:0)

我在

中包装了我的初始数据源更新和-selectRowAtIndexPath:...调用
[_tableView beginUpdates];
// ...
[_tableView endUpdates];

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