UISplitviewcontroller не является контроллером rootview

Я создаю свое первое приложение для iPad. И одно из моих требований - иметь дело с UISplitviewcontroller и UINavigationController.
наша предлагаемая иерархия представления

(LoginView) ->UINavigationView(LandingView + CollectionView)->UISplitViewcontroller( DetailsView).

Наше приложение поддерживает только ландшафтный режим
Я имею в виду этот вопрос(и приложение GILT), так как мне сложно сделать его на основе этого описания.

Так что мои вопросы
1) Как я могу достичь того же, если кто-то может дать небольшие фрагменты кода или ссылку на учебник
2) Согласно Apple HIG, UISplitviewcontroller должен быть rootviewcontroller, что если это не так. Яблоко отклонит мое приложение.(Очевидно, группа GILT была одобрена)
3) Я нашел MGSplitViewController, могу ли я использовать его не как root?
Любая помощь будет оценена. Как новичок я надеюсь, что мой вопрос является подлинным

5 ответов

Если вы хотите использовать splitView из коробки, он должен быть root; Любой хоккеист покер здесь либо нарушает правила по яблокам, либо проявляет очень странное поведение.

MGSplitViewController - это полностью настраиваемая реализация SplitViewController. Это очень хорошо, если вам нужны такие вещи, но некоторые функции основаны на том факте, что наше приложение будет ориентироваться.

В качестве альтернативы вы можете сделать свой собственный. Я делал это не раз, и это проще, чем кажется.

(LoginView) -> UINavigationView (LandingView + CollectionView) -> UISplitViewcontroller (DetailsView).

Исходя из готового UISplitView, я бы предложил:

  • Сделайте splitView корневым представлением.

  • Вставьте (не анимированный) полноэкранный модальный режим, как только приложение запустится, и разрешите пользователю перемещаться по loginView, LandingView и collectView в этом; я также рекомендую использовать navController здесь.

  • Как только пользователь будет готов перейти к splitView, заполните rootView-контроллер splitView и DetailViewController всем, что вам нужно, анимируйте модальное изображение.

У Дейва есть точка зрения, но я бы посмотрел на нее с той точки зрения, что вы удаляете выбор ориентации у пользователя; удаление стандартных вариантов (например, поддерживаемых ориентаций), так как дизайнер полагает, что некоторая конфигурация более эффективна, раздражает только некоторых пользователей.

Я сделал это, сделав метод в моем detailViewController:

-(void)popHomeScreen:(BOOL)animated//OPENS THE HOMESCREEN IN A MODAL DISPLAY
{

  firstRun=NO;
    //myViewControllerForPopOver init here

    myViewControllerForPopOver.modalPresentationStyle = UIModalPresentationFullScreen;  


        myViewControllerForPopOver.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;//simple anime

    if (animated) [self presentModalViewController:myViewControllerForPopOver animated:YES];
        else [self presentModalViewController:myViewControllerForPopOver animated:NO];  
    }

Тогда позвони в detailViewControllersViewDidAppear метод:

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
if(firstRun)[self popHomeScreen:NO];
}

//YOU WILL ALSO NEED TO MAKE 'firstRun=YES' in viewDidLoad
//firstRun is a BOOL

Что касается исчезновения корня (оставляя большое черное пространство).. это известная ошибка. хотя какое-то время я думал, что это было вызвано заказом анимации в то время, когда он собирался нарисовать сам.

Кроме того, я обнаружил, что если я вставил полноэкранный модал поверх splitView, то быстро выскочил другой модал, основанный на форме (например), после того, как полноэкранный модал нарисовался неправильно.

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

Попробуйте это, у меня это работает

1) в didFinishLaunchingWithOptions делегата приложения сделайте ваш вид входа в систему в корневой вид

self.window.rootViewController = self.loginViewController;  

Кроме того, инициализируйте разделенное представление как шаблон (но не добавляйте в self.window)

MasterViewController *masterViewController = [[[MasterViewController alloc] initWithNibName:@"MasterViewController_iPad" bundle:nil] autorelease];
UINavigationController *masterNavigationController = [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease];

    DetailViewController *detailViewController = [[[DetailViewController alloc] initWithNibName:@"DetailViewController_iPad" bundle:nil] autorelease];
    UINavigationController *detailNavigationController = [[[UINavigationController alloc] initWithRootViewController:detailViewController] autorelease];

    self.splitViewController = [[[UISplitViewController alloc] init] autorelease];
    self.splitViewController.delegate = detailViewController;
    self.splitViewController.viewControllers = [NSArray arrayWithObjects:masterNavigationController ,detailNavigationController, nil];

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

-(void)swapToViewControllers:(RootViewControllerType)viewType  
        self.window.rootViewController = self.splitViewController; 

3) вызовите swapToViewControllers в вашем представлении входа в систему.

Имейте в виду, что HIG настоятельно рекомендует вам поддерживать все направления. Если у вас нет очень и очень веских причин поддерживать только ландшафт, вы, вероятно, будете отклонены.

См. Страницу 19 HIG: http://developer.apple.com/library/ios/documentation/General/Conceptual/iPadHIG/iPadHIG.pdf

Модифицированная версия Райана CY с раскадровкой.

Поместите этот код в контроллер входа.
1. Установите идентификатор раскадровки UISplitViewController равным SplitViewController;
2. Установите делегат UISplitViewController и сохраните экземпляр

UISplitViewController* splitController = [self.storyboard instantiateViewControllerWithIdentifier:@"SplitViewController"];
UINavigationController* navigationController = [splitController.viewControllers lastObject];
splitController.delegate = (id)navigationController.topViewController;
3. Измените rootViewController после входа в систему
self.view.window.rootViewController = splitController;

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