UISplitViewController делегировать методы, не вызываемые - PullRequest
7 голосов
/ 10 января 2011

Я использую UISplitViewController внутри UITabBarController с простой UIViewController в главной панели разделенного вида и UINavigationController в области сведений, которая сама содержит ваниль UIViewController.

Мне известно, что Apple рекомендует использовать разделенные представления только на корневом уровне, однако я видел другие приложения (например, Amazon - вкладка «Список пожеланий»), которые используют разделенные представления на вкладках, поэтому я уверен, что это возможно.

Моя проблема заключается в том, что методы делегата разделенного представления, т.е.те, что в UISplitViewControllerDelegate, не вызывают, что не позволяет мне создавать всплывающее меню при переключении в портретный режим.

Способы, о которых идет речь, следующие:

// Called when a button should be added to a toolbar for a hidden view controller
- (void)splitViewController: (UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController: (UIPopoverController*)pc;

// Called when the view is shown again in the split view, invalidating the button and popover controller
- (void)splitViewController: (UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem;

// Called when the view controller is shown in a popover so the delegate can take action like hiding other popovers.
- (void)splitViewController: (UISplitViewController*)svc popoverController: (UIPopoverController*)pc willPresentViewController:(UIViewController *)aViewController;

UISplitViewController действительно ли получает уведомления о вращении.

Я могу получить метод willShowViewController , который будет вызван, если принудительно установить ориентацию строки состояния в альбомную ориентацию вправо (или влево)в начале запуска приложения, используя

 [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];

Однако willHideViewController не вызывается.И я не хочу заставлять приложение запускаться в альбомной ориентации.Если я делаю то же самое, но заставляю его портретировать, я не получаю обратные вызовы.

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

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

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

Застрял в этом весь день!Все остальное работает отлично, и я очень рад, что комбинация splitview / tabbar / navbar работает хорошо.Мне просто нужны эти уведомления.

Должен ли я просто вызывать их вручную при повороте?Кажется очень неправильным, когда `UISplitViewController 'должен делать это.

Ответы [ 3 ]

4 голосов
/ 18 января 2011

Решено, это должно быть либо на корневом уровне, либо на прямом подпредставлении tabBar, которое также должно быть на корневом уровне. Досадно!

3 голосов
/ 06 января 2012

Сначала попробуйте проверить, правильно ли вы устанавливаете делегатов. например, допустим, вы создали три контроллера,

UISplitViewController* splitView;
UIViewController* masterView;
UIViewController* detailView;

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

Теперь, чтобы splitView вызывал эту функцию из делегата, вам нужно установить сам делегат.

Так что где-то, если вы пропустите следующий звонок,

splitView.delegate = detailView;

detailView никогда не получит уведомления об изменениях ориентации и т. Д. По крайней мере, именно здесь я застрял.

2 голосов
/ 09 декабря 2012

Мне нравится следующий способ отправки сообщения от главного UIViewController к подробному UIViewController. Где-то внутри реализации мастера:

id detailViewController = [[self.splitViewController viewControllers] lastObject];
[detailViewController setSomeProperty:…];

Это курс Стэнфордского учебного курса по разработке приложений для iPad и iPhone Пола Хегарти, осень 2011 г.

...