UISplitViewController делегировать методы, не вызываемые

Я использую 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 ответа

Решение

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

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

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

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

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

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

splitView.delegate = detailView;

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

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

http://www.noorselijster19.com/2011/03/ios/combine-tabbar-and-splitview/

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

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

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

Другие вопросы по тегам