I'm facing what appears to be a UIKit bug, and it takes the combination of two less commonly used features to reproduce it, so please bear with me here.
I have quite the common view hierarchy:
UITabBarController -> UINavigationController -> UITableViewController
and the table view controller pushes another table view controller onto the navigation controller's stack when a row is selected. There's absolutely nothing special or fancy in the code here.
However, the second UITableViewController
, the "detail view controller" if you will, does two things:
It sets
hidesBottomBarWhenPushed
toYES
in itsinit
method, so the tab bar is hidden when this controller is pushed:- (id)initWithStyle:(UITableViewStyle)style { if(self = [super initWithStyle:style]) { self.hidesBottomBarWhenPushed = YES; } return self; }
It calls
setToolbarHidden:NO animated:YES
andsetToolbarHidden:YES animated:YES
onself.navigationController
inviewWillAppear:
andviewWillDisappear:
respectively, causing theUIToolbar
provided byUINavigationController
to be displayed and hidden with animations:- (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]; }
Now, if the second UITableViewController
was pushed by selecting the row at the bottom of the screen (it doesn't have to be the last row) in the first controller, this row does not automatically get deselected when the user immediately or eventually returns to the first controller.
Further, the row cannot be deselected by calling deselectRowAtIndexPath:animated:
on self.tableView
in viewWillAppear:
or viewDidAppear:
in the first controller.
I'm guessing this is a bug in UITableViewController
's drawing code which of course only draws visible rows, but unfortunately fails to determine correctly if the bottommost row will be visible in this case.
I failed to find anything on this on Google or OpenRadar, and was wondering if anyone else on SO had this problem or knew a solution/workaround.