UISplitViewController не показывает всплывающую кнопку при запуске портрета - PullRequest
17 голосов
/ 02 мая 2011

Я делаю приложение для iPad на основе UISplitViewController. У меня есть небольшая проблема с кнопкой Toobar, когда мое приложение запущено в Potrait. Кнопка для показа поповера не отображается. Однако, когда я поворачиваю свой iPad в альбомную ориентацию, а затем обратно в портретную, появляется кнопка!

Похоже, что следующий метод не вызывается при запуске (здесь у меня есть код, показывающий кнопку):

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController: (UIPopoverController *)pc

Этот метод вызывается не при запуске приложения, а только при повороте. Еще более странным является то, что я создал тестовое приложение, используя шаблон Xcode UISplitViewController + данные ядра (это похоже на приложение, над которым я работаю, и это шаблон, который я использовал для создания этого приложения). В тестовом приложении, в котором я не написал ни одной строки кода, кнопка отображается, когда я запускаю свое приложение в портретном режиме, и вышеописанный метод также вызывается при запуске, в отличие от моего другого приложения. У кого-нибудь была похожая проблема?

Наконец, из документации Apple не очень ясно, должен ли этот метод вызываться при первом показе UISplitViewController: http://developer.apple.com/library/ios/#documentation/uikit/reference/UISplitViewControllerDelegate_protocol/Reference/Reference.html%23//apple_ref/doc/uid/TP40009454

Ответы [ 6 ]

23 голосов
/ 13 февраля 2012

«Кшитиз» имеет правильную концепцию.Во-первых, я установил self.splitviewController.delegate = self в методе viewDidLoad, что уже слишком поздно, чтобы установить это делегирование.Итак, я попытался установить делегирование на более ранней стадии, которая является методом awakeFromNib.Тогда это работает хорошо.

Итак, проблема в том, что после просмотра, уже загруженного viewDidLoad, делегирование не будет работать, оно будет работать через некоторое время после некоторых действий (таких как поворот iPad).Поэтому более ранняя стадия, чем viewDidLoad - это awakeFromNib.

Вот код, который работает:

- (void) awakeFromNib{
    [super awakeFromNib];
    self.splitViewController.delegate = self;
}
1 голос
/ 02 мая 2011

Вы установили делегата splitviewcontroller?Обычно проблема возникает, когда делегат не установлен.

0 голосов
/ 30 августа 2012

Я застрял на этом довольно долго. Наконец получил его на работу. У меня не работает awakeFromNib. DidFinishLaunchingWithOptions сделал. Возможно, потому что я выполняю какой-то запрос, который заполняет элементы в контроллере popover.

0 голосов
/ 08 мая 2012

Это также помогло мне сэкономить, тем более что я работаю над двумя проектами для iPad с готовым splitViewController, и первый всегда показывает кнопку «Master», а второй - нет. Я сравнивал торговые точки, отношения и делегатов, пока не посмотрел в глаза, но, наконец, нашел ответ в appDelegate. Оказалось, я слишком много прокомментировал в приложении: didFinishLaunchingWithOptions:, особенно там, где установлен splitViewController.delegate.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
        UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
        splitViewController.delegate = (id)navigationController.topViewController;
    }

Добавление этого в appDelegate избавляет вас от необходимости создавать подклассы splitViewController. Я также пытался подключить делегата в IB, но по какой-то причине у него ничего не было бы. Недостаток раскадровки, imho.

0 голосов
/ 11 ноября 2011

У меня была точно такая же проблема, и ответ Мартина Гуннарссона привел меня к решению.

Раньше я устанавливал свойство делегата UISplitViewController после того, как представление делегата (представление детали) уже было загруженов viewDidLoad:.К этому времени UISplitViewController уже отправил начальное сообщение splitViewController:willHideViewController:withBarButtonItem:forPopoverController:.Я просто не достаточно быстро назначил делегата.

Решением было назначить делегата в делегате основного приложения, в application:DidFinishLaunchingWithOptions:.В этом случае мой делегат содержался в контроллере навигации, поэтому мне пришлось копать один слой глубже, чтобы получить его.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
    UINavigationController *mainNavigationController = (UINavigationController *)[splitViewController.viewControllers objectAtIndex:1];
    HPMainViewController *mainViewController = [mainNavigationController.viewControllers objectAtIndex:0]; 

    splitViewController.delegate = mainViewController;
    return YES;
}
0 голосов
/ 04 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...