2012-01-12 3 views
2

Я использую UIPageViewController в первый раз. Это, конечно, iOS5, и мне нравится ARC. Я не с использованием раскадровки.UIPageViewController как корневой контроллер приложения

Во всех разрозненных примерах, которые я вижу, UIPageViewController никогда не «владеет» экраном. Он всегда является дочерним элементом какого-либо другого контроллера представлений. Это требование? Я хочу сделать его корневым контроллером моего приложения, как обычно это делается с помощью UINavigationController. Я пытаюсь установить все это программно, но все, что я получаю, это пустой диспетчер просмотра страниц, без содержимого.

Вот как приложение начинается (весь код здесь, в моем приложении класса делегата):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    [self configureLoggers]; 
    [self applyAppearanceProxySettings]; 
    [self configureDataStore]; 
    [self configureNavigationController]; 
    [self configurePageController]; // <-- this is where we do the page view controller setup, shown next. 

    self.window.rootViewController = self.pageController; 
    [self.window makeKeyAndVisible]; 

    log4Info(@"Application completed launching."); 

    return YES; 
} 

И этот метод упоминается в приведенном выше коде, что делает установку для Page View Controller:

- (void)configurePageController { 
    CCFrontCoverViewController *frontCoverViewController = [[CCFrontCoverViewController alloc] initWithNibName:nil bundle:nil]; 

    NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:UIPageViewControllerSpineLocationMin] 
                forKey:UIPageViewControllerOptionSpineLocationKey]; 

    self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl 
                 navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal 
                    options:options]; 

    self.pageController.delegate = self; 
    self.pageController.dataSource = self; 
    self.pageController.view.backgroundColor = [UIColor redColor]; // So we know we're missing content because red shows through. 

    NSArray *pageViewControllers = [NSArray arrayWithObjects:frontCoverViewController, self.navigationController, nil]; 
    [self.pageController setViewControllers:pageViewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 
} 

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

Когда это выполняется, я просто получаю пустой красный экран. Опять же, нет раскадровки. Что мне не хватает?

+0

Получаете ли вы какие-либо ошибки вообще? Вы уверены, что self.navigationController не ноль? – dtuckernet

+0

У меня есть утверждение, подтверждающее, что self.navigationController не равен нулю в точке, где я добавляю его в стек контроллеров контроллера просмотра. Единственная ошибка, которую я вижу, я видел, как люди отклонялись на форумах Apple dev как ошибка: «Контроллер представления возвратил NO из -shouldAutorotateToInterfaceOrientation: для всех ориентаций интерфейса. Он должен поддерживать по крайней мере одной ориентации ". – idStar

+0

См. [Это] (https://devforums.apple.com/message/563625#563625) обсуждение в форумах разработчиков Apple относительно этого сообщения об ошибке (я прочитал его как сообщение UIPageViewController будет возвращать «НЕТ» во все ориентации в любое время он не настроен должным образом ...). –

ответ

5

Я могу использовать UIPageViewController в качестве контроллера зрения корень в примере проекта при условии, что:

  • UIPageViewController правильно инициализирован с действительным адресом позвоночника.
  • UIPageViewController 's doubleSided объект недвижимости (согласовано с расположением позвоночника).
  • UIPageViewController: viewControllers массив установлен (опять же, соответствует местоположению позвоночника и doubleSided).

Похоже, что вы не установили doubleSided в YES в коде (так как ваш viewControllers массив имеет два элемента в нем). Добавляет ли это, что перед установкой массива viewControllers исправить вашу проблему?

EDIT: Только для потомков, в UIPageViewController docs есть график в описании setViewControllers:direction:animation:completion: метода, показывающего количество контроллеров отображения разрешенных для всех допустимых комбинаций расположения позвоночника и doubleSided.

+1

Спасибо Тим.Переломным моментом для меня является ваше упоминание о правильном настройке viewControllers. Я думал, что мы можем дать произвольный стартовый набор, но когда мы не будем делать двухсторонние и двухсторонние, но просто старое одиночное разворачивание страницы, мы должны предоставить только * one * initial view controller и позволить методам источника данных для следующая/предыдущая страница возьмите его оттуда. Хороший контрольный список, чтобы убедиться, что мы его правильно настроили! – idStar

+1

Справа. Вы только когда-либо помещаете один или два контроллера вида в массив, который вы предоставляете 'setViewControllers:', в зависимости от того, сколько страниц отображает ваш UIPageViewController. –

Смежные вопросы