Увольняющийся модальный вид iPad портит панели UISplitView - PullRequest
2 голосов
/ 30 августа 2010

Предпосылка удивительно проста: я хочу отобразить модальное представление в приложении для iPad, которое использует UISplitViewController.

Иерархия представлений проста:

                                              /- 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 (корневое представление разделенного представления) внезапно поворачивается и изменяется.Контент внезапно переходит на бок и частично покрывает вид деталей.Представление сведений не изменяется, чтобы быть меньше, оно лишь частично покрывается корневым представлением.

Единственная ситуация, когда эта проблема не возникает, - это когда я нажимаю на ячейку TableViewController1, когда приложение находится в портретной ориентации.Режим.Несмотря на то, что корневое представление находится в поповере (что может быть достаточным источником ошибок), все работает отлично.

Некоторые вещи, которые я уже пробовал, безуспешно:

  • Дампна панели вкладок просто отобразите TableViewController1 в качестве корневого контроллера разделенного представления
  • Создайте протокол делегирования, чтобы родительский TableViewController1 отклонял модальное представление, а не само представление MyModalClass.
  • Представление / отклонениемодальное представление TableViewController1.splitViewController на самом деле усугубляет ситуацию: представление даже не появляется.
  • Пожертвование нескольких коз также не помогло.

Я был бы очень признателен за любой вклад вэта проблема.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2013

У меня была та же проблема, что и у вас, я решил ее с помощью программно-временного принудительного вращения моего представления viewController (когда-то возвращенного к нему) в его методе viewDidAppear с некоторым произвольным поворотом. Конечно без анимации. А затем повернул его обратно в требуемую ориентацию (которую я сохранил до поворота).

Так что, если vc1 отображает vc2 модально, а пользователь поворачивает vc2, я устанавливаю ориентацию vc1 в соответствии с текущей ориентацией vc2, вызывая: UIInterfaceOrientation currentOrientation = self.interfaceOrientation; // сохранить текущую ориентацию vc2 (модальный вид) [vc1 willRotateToInterfaceOrientation: текущая длительность ориентации: 0];

Затем я отклоняю vc2 и в viewWillAppear из vc1 я делаю это:

- (void) viewDidAppear: (BOOL) анимированный {

[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.

}

0 голосов
/ 25 октября 2010

У меня есть своего рода ответ на мой собственный вопрос: я использовал инструменты для систематического устранения всех утечек памяти в моем приложении.Как только я это сделал, проблема исчезла.

...