Иногда willHideViewController из UISplitViewControllerDelegate не вызывается

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

Проблема в том, что иногда не вызывается willHideViewController из UISplitViewControllerDelegate, поэтому верхняя/левая кнопка иногда не создается, что раздражает. Я понял, чтобы воспроизвести эту ошибку, попробуйте несколько раз это: -Ландшафтный режим. -Выберите вкладку, отличную от касания контроллера разделенного вида. -Переместите iPad в книжную ориентацию на этой вкладке. - Перейдите на вкладку контроллера разделенного представления, и иногда willHideViewController не вызывается, поэтому вы не увидите верхнюю кнопку. Однако, если я поверну свой iPad в альбомную ориентацию, а затем в портретную, это будет исправлено.

Я попытался вручную выполнить несколько вращений, чтобы обойти эту проблему, но безуспешно. Мне все еще нужно попробовать любой класс клонирования контроллера с разделенным представлением из github или подобного. Есть ли у вас идеи, что происходит или какие-либо обходные пути?

Здесь я покажу вам два примера, работающих правильно.

введите здесь описание изображениявведите здесь описание изображения Большое спасибо за помощь.


person Ricardo    schedule 15.01.2012    source источник
comment
Привет, у меня точно такая же проблема, ты что-нибудь с этим сделал? Я думаю, что необходим способ распространения вызовов willShow... willHide на всех вкладках. Довольно неприятно...   -  person Snips    schedule 27.02.2012
comment
Здесь такая же проблема, также с UISplitViewController внутри UITabBarController. В моем приложении поведение UISplitViewController дополнительно зависит от ориентации, в которой запускается приложение: если оно запускается в альбомной ориентации, поведение будет таким, как вы описываете. Однако, если приложение запускается в портретной ориентации, ваш сценарий работает нормально, но вместо этого возникает проблема, когда приложение поворачивается в альбомную ориентацию (UISplitViewController не вызывает метод делегата willShowViewController:invalidatingBarButtonItem:).   -  person herzbube    schedule 08.07.2013


Ответы (2)


Где вы устанавливаете делегата splitViewControllers? Возможно, вы можете установить делегата при загрузке вкладки. Похоже, вы установили его только после одного поворота?

В противном случае см. этот пример

Здесь у них TableViewController является делегатом splitviewcontroller. Возможно, вы могли бы сделать то же самое с TabBarController?

person CracyD    schedule 19.01.2012

Я пришел к выводу, что это невозможно сделать каким-либо способом, который я считаю «достаточно» законным. Можно разочароваться, но проблема с распространением willShow..., willHide на контроллеры разделенного представления на каждой вкладке остается.

Решение, которое, скорее всего, сработает,

https://github.com/grgcombs/IntelligentSplitViewController/blob/master/IntelligentSplitViewController.m

Хотя этот код, несомненно, умен, для меня он слишком «побочный». Я подозреваю (но не знаю), что недостаточно просто вызвать методы делегата. Конечно, сам UISplitViewController должен изменить свое внутреннее состояние, а также вызвать методы делегата? Этот метод «просто» вызывает методы делегата при изменении ориентации.

Итак... Я выбрал более законное решение, которое заключается в использовании нового метода, представленного в iOS 5.

- (BOOL) splitViewController:(UISplitViewController *)svc
             shouldHideViewController:(UIViewController *)vc
             inOrientation:(UIInterfaceOrientation)orientation
{
     return NO;
}

Итак, мастер-меню никогда не скрывается, а значит и проблемы с управлением поповером не возникает.

Конечно, это все еще не совсем «законно», поскольку оно по-прежнему включает в себя UISplitViewController, которые не находятся на верхнем уровне (UISplitViewController находится на верхнем уровне, а разделенные представления находятся на каждой вкладке).

Удачи с любым решением, которое вы выберете.

Я обновлю этот ответ, когда подтвержу, что Apple одобрит приложение, использующее это решение.

person Snips    schedule 28.02.2012