2010-08-29 2 views
2

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

Иерархия мнение прямолинейно:

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

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

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

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

ответ

0

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

0

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

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

Тогда я dissmiss VC2 и в viewWillAppear из VC1 я делаю это:

- (Недействительными) 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. 

}

Смежные вопросы