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

时间:2010-04-12 00:12:37

标签: iphone uikit uitableview

我正面临着一个似乎是UIKit的错误,它需要两个不太常用的功能组合来重现它,所以请在这里忍受。

我有很常见的视图层次结构:

UITabBarController -> UINavigationController -> UITableViewController

并且当选择行时,表视图控制器将另一个表视图控制器推送到导航控制器的堆栈上。这里的代码绝对没什么特别或花哨的。

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

  1. 它在hidesBottomBarWhenPushed方法中将YES设置为init,因此在按下此控制器时隐藏了标签栏:

    - (id)initWithStyle:(UITableViewStyle)style {
        if(self = [super initWithStyle:style]) {
            self.hidesBottomBarWhenPushed = YES;
        }
        return self;
     }
    
  2. 分别在setToolbarHidden:NO animated:YESsetToolbarHidden:YES animated:YES的{​​{1}}上调用self.navigationControllerviewWillAppear:,导致viewWillDisappear:由{UIToolbar提供1}}用动画显示和隐藏:

    UINavigationController
  3. 现在,如果通过在第一个控制器中选择屏幕底部的行(它不必是最后一行)来推动第二个- (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]; } ,则此行不会自动取消选中用户立即或最终返回第一个控制器。

    此外,无法通过调用UITableViewControllerdeselectRowAtIndexPath:animated:上的self.tableView或第一个控制器中的viewWillAppear:来取消选择该行。

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

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

2 个答案:

答案 0 :(得分: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]; 
}

答案 1 :(得分:0)

如果我记得很清楚,我认为我有一次相同/类似的问题,但我的解决方案相当粗糙:

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