我正面临着一个似乎是UIKit的错误,它需要两个不太常用的功能组合来重现它,所以请在这里忍受。
我有很常见的视图层次结构:
UITabBarController -> UINavigationController -> UITableViewController
并且当选择行时,表视图控制器将另一个表视图控制器推送到导航控制器的堆栈上。这里的代码绝对没什么特别或花哨的。
然而,如果你愿意的话,第二个UITableViewController
,即“详细视图控制器”会做两件事:
它在hidesBottomBarWhenPushed
方法中将YES
设置为init
,因此在按下此控制器时隐藏了标签栏:
- (id)initWithStyle:(UITableViewStyle)style {
if(self = [super initWithStyle:style]) {
self.hidesBottomBarWhenPushed = YES;
}
return self;
}
分别在setToolbarHidden:NO animated:YES
和setToolbarHidden:YES animated:YES
的{{1}}上调用self.navigationController
和viewWillAppear:
,导致viewWillDisappear:
由{UIToolbar
提供1}}用动画显示和隐藏:
UINavigationController
现在,如果通过在第一个控制器中选择屏幕底部的行(它不必是最后一行)来推动第二个- (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
中deselectRowAtIndexPath:animated:
上的self.tableView
或第一个控制器中的viewWillAppear:
来取消选择该行。
我猜这是viewDidAppear:
绘图代码中的一个错误,当然只会绘制可见行,但遗憾的是无法正确判断在这种情况下最底行是否可见。
我在Google或OpenRadar上找不到任何相关内容,并且想知道SO上的其他人是否有这个问题或知道解决方案/解决方法。
答案 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;
}