UISplitViewController не скрывает masterViewController в ландшафтном режиме

ПРИМЕЧАНИЕ. Прежде чем читать этот вопрос, обратите внимание, что я прочитал предыдущие вопросы, которые объясняют недостатки, связанные с реализацией Apple UISplitViewController, и как я должен использовать «MGSplitViewController» с открытым исходным кодом, потому что не так просто просто скрыть главный контроллер представления на контроллер с разделенным видом в ландшафтном режиме. Пожалуйста, имейте в виду, что я ограничен использованием обычного UISplitViewController в iOS 5.1.

Теперь по вопросу:

У меня есть контроллер разделенного представления с табличными представлениями слева (главное представление) и контроллером подробного представления справа. Я использую навигационный контроллер для управления левой стороной, которая представляет собой табличное представление, которое переходит в другое табличное представление ("DataTableViewController"). Чтобы скрыть эту левую сторону, я разместил кнопку «скрыть» на панели инструментов навигации контроллера подробного представления. Когда кнопка скрытия нажата, я изменяю свое свойство «_hideMaster»:

-(IBAction)hidePressed
{
    _hideMaster = !_hideMaster;
    // Must manually reset the delegate back to self in order to force call "shouldHideViewController"
    self.splitViewController.delegate = nil;
    self.spliteViewController.delegate = self;

}

а затем автоматически этот метод вызывается в делегате SplitViewController:

// This is called when I change the delegate from nil back to self.
- (BOOL)splitViewController: (UISplitViewController*)svc shouldHideViewController: (UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation 
{
    return _hideMaster;
}

Когда я его отлаживаю, я вижу, что все идет по плану и свойство имеет правильное значение при входе в метод splitViewController:shouldHideViewController:inOrientation:

Единственная проблема в том, что ничего не происходит. Мой самый левый вид таблицы (DataTableViewController) не исчезает. Когда я присмотрюсь, параметр (UIViewController *)vc в методе делегата — это не контроллер представления таблицы, который я хочу скрыть, а контроллер навигации, связанный с этим представлением таблицы. Так что, по сути, он пытается скрыть навигационный контроллер, а это явно не то, чего я хочу...

Как я могу сделать так, чтобы параметр UIViewController в автоматически вызываемом методе делегата (shouldHideViewController:) вызывал самый верхний контроллер представления, связанный с этим контроллером навигации? (Ведь я хочу спрятать DataTableViewController)


person Bitwise    schedule 08.08.2012    source источник
comment
очень надеялся получить ответ на этот вопрос...   -  person Bitwise    schedule 08.08.2012


Ответы (1)


Вот как я с этим справляюсь. Возможно, потребуется дополнительная работа для повторного появления MasterViewController, если он не будет создан на обратном пути.

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.30f];
[[self.splitViewController.viewControllers lastObject] view].frame = self.splitViewController.view.frame;
[UIView commitAnimations];
person David Chu    schedule 20.10.2012