UISplitviewcontroller не является корневым контроллером - PullRequest
11 голосов
/ 11 октября 2010

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

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

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

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

Ответы [ 5 ]

12 голосов
/ 12 октября 2010

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

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

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

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

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

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

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

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

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

2 голосов
/ 19 июня 2012

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

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 в вашем представлении входа в систему.

2 голосов
/ 17 октября 2010

Я сделал это, сделав метод в моем 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];  
    }

Затем вызовите его методом detailViewControllers ViewDidAppear:

-(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 похожи на вашу свекровь, они вам не очень нравятся, и когда вы должны их использовать, вам приходится обходить минами все вокруг.

0 голосов
/ 01 октября 2013

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

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

<code>UISplitViewController* splitController = [self.storyboard instantiateViewControllerWithIdentifier:@"SplitViewController"];
UINavigationController* navigationController = [splitController.viewControllers lastObject];
splitController.delegate = (id)navigationController.topViewController;
3. Измените rootViewController после входа в систему
self.view.window.rootViewController = splitController;
0 голосов
/ 11 октября 2010

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

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

...