奇怪的 UIKit 错误,表格视图行保持选中状态

Posted

技术标签:

【中文标题】奇怪的 UIKit 错误,表格视图行保持选中状态【英文标题】:Strange UIKit bug, table view row stays selected 【发布时间】:2010-04-12 00:12:36 【问题描述】:

我遇到了一个 UIKit 错误,它需要结合两个不太常用的功能来重现它,所以请耐心等待。

我有相当通用的视图层次结构:

UITabBarController -> UINavigationController -> UITableViewController

和表视图控制器在选择行时将另一台表视图控制器按到导航控制器的堆栈上。这里的代码绝对没有什么特别或花哨的。

但是,第二个UITableViewController,如果你愿意的话,“详细视图控制器”会做两件事:

    它在其init 方法中将hidesBottomBarWhenPushed 设置为YES,所以当这个控制器被按下时标签栏是隐藏的:

    - (id)initWithStyle:(UITableViewStyle)style 
        if(self = [super initWithStyle:style]) 
            self.hidesBottomBarWhenPushed = YES;
        
        return self;
     
    

    它分别在viewWillAppear:viewWillDisappear: 中的self.navigationController 上调用setToolbarHidden:NO animated:YESsetToolbarHidden:YES animated:YES,导致UINavigationController 提供的UIToolbar 以动画形式显示和隐藏:

    - (void)viewWillAppear:(BOOL)animated 
        [super viewWillAppear:animated];
        [self.navigationController setToolbarHidden:NO animated:YES];
    
    
    - (void)viewWillDisappear:(BOOL)animated 
        [super viewWillDisappear:animated];
        [self.navigationController setToolbarHidden:YES animated:YES];
    
    

现在,如果第二个UITableViewController 是通过在第一个控制器中选择屏幕底部的行(不一定是最后一行)来推动的,那么当用户使用该行时,该行不会自动取消选择立即或最终返回到第一个控制器。

此外,不能通过在viewWillAppear: 中的self.tableView 上调用deselectRowAtIndexPath:animated: 或在第一个控制器中的viewDidAppear: 来取消选择该行。

我猜这是UITableViewController 的绘图代码中的一个错误,它当然只绘制可见行,但遗憾的是无法正确确定在这种情况下最底部的行是否可见。

我在 Google 或 OpenRadar 上找不到任何关于此的内容,我想知道 SO 上的其他人是否有此问题或知道解决方案/解决方法。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题(尽管我没有使用工具栏)。我的解决方案是在推送我的第二个视图控制器后取消选择 didSelectRowAtIndexPath 中的行。

- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    RunViewController *runViewController = [[RunViewController alloc] initWithNibName:@"RunViewController" bundle:nil];
    runViewController.managedObjectContext = self.managedObjectContext;
    runViewController.hidesBottomBarWhenPushed = YES;
    [self.navigationController pushViewController:runViewController animated:YES];
    [runViewController release];

     //deslect "stuck" row
    [aTableView deselectRowAtIndexPath:indexPath animated:YES]; 

【讨论】:

当然这与默认和预期的行为不同。 好吧,当它开始发生时,我当然认为这是出乎意料的,但上面的解决方案对我有用,所以我并没有真正进一步追求它。【参考方案2】:

如果我记得很清楚,我想我曾经遇到过相同/类似的问题,但我的解决方案相当粗糙:

- (UITableViewCell*)tableView:(UITableView*)tableView 
        cellForRowAtIndexPath:(NSIndexPath*)indexPath 
  // ...
  cell.selectionStyle = UITableViewCellSelectionStyleNone;

【讨论】:

以上是关于奇怪的 UIKit 错误,表格视图行保持选中状态的主要内容,如果未能解决你的问题,请参考以下文章

多选模式列表视图行在删除后保持选中状态

选中模态视图行

UITableView 选定的单元格在滚动时不会保持选中状态

表(固定数据表)第一行的 React Redux 复选框保持选中状态

如果 AJAX 错误,请取消选中复选框 [重复]

如何用javascript控制表格的行处于被选中状态