Увольнение iPad Modal View Messes Up панелей UISPLITVIEW
-
02-10-2019 - |
Вопрос
Предпосылка удивительно проста: я хочу отобразить модальный вид в приложении iPad, который использует UISPLITVIVECONTROLLER.
Иерархия просмотра прямой вперед:
/- TableViewController1
/- root:TabBarController -- TableViewController2
SplitViewController -
\- detail:CustomViewController
Когда я нажимаю на один из клеток в таблице в TableViewController1, я открываю модальный вид:
- (void)tableView:(UITableView *)tv didSelectRowAtIndexPath:(NSIndexPath *)ip {
UIViewController *vc = [[MyModalClass alloc] init];
UINavigationController *nc = [[UINavigationController alloc]
initWithRootViewController:vc];
nc.modalPresentationStyle = UIModalPresentationFormSheet;
nc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:nc animated:true];
[nc release];
[vc release];
}
Это работает просто хорошо: появляется вид. Проблемы начинаются, когда я пытаюсь уволить его в любой ориентации, отличной от ландшафта.
В ModalViewController следующий метод запускается UITabbarbutton в панели навигации:
- (void) closeButtonInNavBarWasClicked:(id)sender {
[self dismissModalViewControllerAnimated:true];
}
И это где начинаются проблемы.
Когда этот код называется, модальный вид исчезает, но: TabBarController (Root View Split View) внезапно вращается и изменяется. Контент внезапно вбок и частично охватывает вид детали. Представление деталей не изменяется для меньшего размера, он просто частично покрыт корневым видом.
Единственная ситуация, когда эта проблема не отображается, - это когда я нажимаю на ячейку TableViewController1, когда приложение находится в портретном режиме. Несмотря на корневой вид, находящийся в поповете (который может быть достаточно источником ошибок), все работает нормально.
Некоторые вещи, которые я уже пробовал, без успеха:
- Сбросьте полосу вкладки, просто отображайте TableViewController1 в качестве корневого контроллера сплит-вида
- Создайте протокол делегата, чтобы родительский TableViewController1 отклонил модальный вид, а не сам вид MyModalClass.
- Представление / отклонение модального взгляда на TableViewController1.splitviewController на самом деле делает все хуже: вид даже не появляется.
- Пожертвование нескольких коз и не помогло.
Я бы очень оценил любой вклад по этому вопросу.
Решение
У меня есть своего рода ответ на свой собственный вопрос: я использовал инструменты для систематического устранения всех утечек памяти в моем приложении. Однажды я сделал это, проблема исчезла.
Другие советы
У меня была такая же проблема, как и вы, я решил его с помощью программно временно заставить вращать мой reducting ViewController (однажды возвращаемый к нему), в своем методе ViewDiDiDAppear для некоторого произвольного вращения. Конечно без анимации. А затем повернул его обратно к требуемой ориентации (который я сохранил до вращения).
Таким образом, если VC1 отображает VC2 модули, и пользователь поворачивает VC2, я устанавливаю ориентацию VC1 в соответствии с текущей ориентацией VC2 путем вызова: UIInterfaceorientation Currentorientation = Self.interfaceSorentation; // хранить текущую ориентацию VC2 (модальный вид) [VC1 WilrotateTeTorfacterfactorientation: refortorientation Продолжительность: 0];
Затем я Dissmiss VC2 и в ViewWillAppear VC1 я делаю это:
- (пустота) ViewDiDiDAppear: (Bool) Animated {
[super viewDidAppear:animated];
/* Store wanted orientation */
UIInterfaceOrientation currentOrientation = self.interfaceOrientation;
/* rotate to some arbitrary orientation, this solves the bug. */
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortraitUpsideDown animated:NO];
[[UIDevice currentDevice] setOrientation:currentOrientation animated:NO]; //restore wanted orientation.
}