UISplitViewController не показывает всплывающую кнопку при запуске portrait

StackOverflow https://stackoverflow.com/questions/5855639

Вопрос

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

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

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

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

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

Это было полезно?

Решение

У "Кшитиза" правильная концепция.сначала я установил self.splitViewController.delegate = self в методе viewDidLoad, который немного запоздал для установки этого делегирования.Итак, я попытался установить делегирование на более ранней стадии, которая является методом awakeFromNib.Тогда это работает хорошо.

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

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

- (void) awakeFromNib{
    [super awakeFromNib];
    self.splitViewController.delegate = self;
}

Другие советы

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

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

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

Решение состояло в том, чтобы назначить делегата в главном приложении delegate, в 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;
}

Это также заставило меня сэкономить, тем более что я работаю над двумя проектами для iPad с готовым splitViewController, и на первом всегда отображается кнопка "Мастер", в то время как на втором этого никогда не было.Я сравнивал торговые точки, отношения и делегатов, пока у меня не закрались глаза, но в конце концов нашел ответ в 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, но по какой-то причине в нем ничего этого не было.Недостаток дизайна раскадровки, имхо.

Я застрял на этом довольно долго.Наконец-то это заработало.Пробуждение от NI B у меня не сработало.Сделал didFinishLaunchingWithOptions.Возможно, это связано с тем, что я выполняю некоторый запрос, который заполняет элементы в контроллере всплывающего окна.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top