Я сталкиваюсь с тем, что кажется ошибкой 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
для self.navigationController
в viewWillAppear:
и viewWillDisappear:
соответственно, в результате чего UIToolbar
, предоставленный 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:
в первом контроллере.
Я предполагаю, что это ошибка в коде рисования UITableViewController
, который, конечно, рисует только видимые строки, но, к сожалению, не может правильно определить, будет ли видна самая нижняя строка в этом случае.
Мне не удалось найти что-либо об этом в Google или OpenRadar, и мне было интересно, если кто-то еще в SO имел эту проблему или знал решение / обходной путь.