0

通常我典型的 didselectrowatindexpath 是这样的:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath];
    BGUIBusinessCellForDisplay * cellBiz = (BGUIBusinessCellForDisplay *) cell;
    [BGDetailBusinessViewController detailButtonPressed:cellBiz.biz withNavController:self.navigationController];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

所以如果一行是selectec,打开一个新窗口什么的。然后快速取消选择该行。不取消选择该行意味着当我们取回之前选择的行时仍然存在。

但是,如果我检查我过去的代码,我发现该行已成功取消选择,即使我根本没有调用取消选择

我在各处放置了一个陷阱来跟踪取消选择该行的位置和时间:

-(void)viewDidAppear:(BOOL)animated
{

...

PO(self.tableView.indexPathForSelectedRow); //always show null here
while(false);

}

原来 viewDidAppear,说我从细节返回后,self.tablevView.indexPathForSelectedRow 已经为空。所以该行已经被取消选择但是何时何地?

我在明显的地方放了更多的陷阱

-(void)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
    while (false);//breakpoint here never called
}

-(void) tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *) indexPath
{
    while (false); //breakpoint here never called 
}

这些都没有被调用。

我放弃。

现在还不算大,但这让我无休止地困惑

这是完整的 didSelectRowForIndexPath,因此您可以验证那里没有取消选择命令

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath];

    if ([cell isKindOfClass:[BGUIBusinessCellForDisplay class]])
    {
        BGUIBusinessCellForDisplay * cellBiz = (BGUIBusinessCellForDisplay *) cell;
        [BGDetailBusinessViewController detailButtonPressed:cellBiz.biz withNavController:self.navigationController];
    }
    else if ([cell isKindOfClass:[BGAddMoreBusiness class]])
    {
        BGBusinessEditViewController * editBusiness = [[BGBusinessEditViewController alloc]init];
        [self.navigationController SafelyPushController:editBusiness];
    }
    PO(self.tableView.indexPathForSelectedRow); //not null here
}
4

2 回答 2

3

这是 的默认行为UITableViewController,请参阅 的文档clearsSelectionOnViewWillAppear

此属性的默认值为YES。当 时YES,表格视图控制器在收到 viewWillAppear:消息时清除表格的当前选择。将此属性设置为NO保留选择。

于 2013-01-09T09:27:49.407 回答
0

更新:viewWillAppear仍然选择按行。,viewDidAppear它不再是。他们之间有[table reload]。看起来像[table reload]取消选择该行。

于 2013-01-09T09:29:33.610 回答