问题 UISplitviewcontroller不作为rootview控制器


我正在构建我的第一个iPad应用程序。我的一个要求是处理UISplitviewcontroller和UINavigationController。
我们建议的视图层次是

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

我们的应用仅支持横向模式
 我指的是这个 所以问题(以及GILT应用程序),作为newbi,我很难根据该描述完成它。

所以我的问题是
1)如果有人可以提供小代码片段或参考教程,我怎样才能实现相同的目标
2)根据Apples HIG,UISplitviewcontroller应该是rootviewcontroller,如果没有的话。 Apple会不会拒绝我的应用程序。(显然GILT小组已被批准)
3)我找到了 MGSplitViewController ,我可以使用那个不是root用户吗?
任何帮助,将不胜感激。作为newbi,我希望我的问题是真实的


2305
2017-10-11 19:33


起源



答案:


如果你想使用现成的splitView它 必须 是根;这里的任何一个野蛮人都会打破苹果指导方针或表现出非常奇怪的行为。

MGSplitViewController 是完全自定义的SplitViewController实现。如果你需要那种东西它非常好,但有些功能是基于我们的应用程序将定位的事实。

或者你也可以做自己的。我不止一次这样做,比听起来容易。

(LoginView)    - > UINavigationView(LandingView + CollectionView) - > UISplitViewcontroller(   DetailsView控件)。

基于开箱即用的UISplitView,我建议:

  • 使splitView成为根视图。

  • 应用程序启动后立即弹出(不动画)全屏模态并允许 用户导航loginView, LandingView和collectView在此;我还建议在这里使用navController。

  • 一旦用户准备好继续 splitView,填充 splitView的rootView控制器和 DetailViewController用什么 你想要的,将Modal动画化。

Dave确实有一点,但我会从你从用户那里删除方向选择的角度来看待它;删除标准选择(如支持的方向),因为设计者假设某些配置更有效只会惹恼一些用户。


12
2017-10-12 08:31



谢谢卢克。这很好解释。我想到的另一个想法是,如果我使用UIsplitviewcontroller并隐藏rootviewcontroller并使用detailview控制器作为导航控制器怎么办?(因为我只有横向模式)是可能的吗? - Nnp
我没有试过这个,并且会在黑暗中刺伤并说它可能会给你一些无法预料的头痛,比如调整细节的框架。 (在横向上,detailView的x偏移量为350ish)如果你 真 我希望这样做,我会将MGSplitViewController屠宰成提交。虽然不要忘记先阅读许可证。我最初的建议绝对是最无痛的解决方案。 - Luke Mcneice
非常感谢卢克...... - Nnp
作为一个插件问题:即使我创建了分割视图控制器root,它也只能在从主xib加载时才能工作。一旦我把它放在一个单独的xib中,将我的视图控制器 - 它继承自UISplitViewController - 与它相关联,并添加它,我得到的只是一个黑屏。设置断点我注意到split控制器的内部视图永远不会被加载。好像整个xib都不会被加载。但是没有错误。任何想法如何把它放入自己的xib?还是不可能? - Krumelur
innerViews?你的意思是rootViewController和detailViewController? - Luke Mcneice


答案:


如果你想使用现成的splitView它 必须 是根;这里的任何一个野蛮人都会打破苹果指导方针或表现出非常奇怪的行为。

MGSplitViewController 是完全自定义的SplitViewController实现。如果你需要那种东西它非常好,但有些功能是基于我们的应用程序将定位的事实。

或者你也可以做自己的。我不止一次这样做,比听起来容易。

(LoginView)    - > UINavigationView(LandingView + CollectionView) - > UISplitViewcontroller(   DetailsView控件)。

基于开箱即用的UISplitView,我建议:

  • 使splitView成为根视图。

  • 应用程序启动后立即弹出(不动画)全屏模态并允许 用户导航loginView, LandingView和collectView在此;我还建议在这里使用navController。

  • 一旦用户准备好继续 splitView,填充 splitView的rootView控制器和 DetailViewController用什么 你想要的,将Modal动画化。

Dave确实有一点,但我会从你从用户那里删除方向选择的角度来看待它;删除标准选择(如支持的方向),因为设计者假设某些配置更有效只会惹恼一些用户。


12
2017-10-12 08:31



谢谢卢克。这很好解释。我想到的另一个想法是,如果我使用UIsplitviewcontroller并隐藏rootviewcontroller并使用detailview控制器作为导航控制器怎么办?(因为我只有横向模式)是可能的吗? - Nnp
我没有试过这个,并且会在黑暗中刺伤并说它可能会给你一些无法预料的头痛,比如调整细节的框架。 (在横向上,detailView的x偏移量为350ish)如果你 真 我希望这样做,我会将MGSplitViewController屠宰成提交。虽然不要忘记先阅读许可证。我最初的建议绝对是最无痛的解决方案。 - Luke Mcneice
非常感谢卢克...... - Nnp
作为一个插件问题:即使我创建了分割视图控制器root,它也只能在从主xib加载时才能工作。一旦我把它放在一个单独的xib中,将我的视图控制器 - 它继承自UISplitViewController - 与它相关联,并添加它,我得到的只是一个黑屏。设置断点我注意到split控制器的内部视图永远不会被加载。好像整个xib都不会被加载。但是没有错误。任何想法如何把它放入自己的xib?还是不可能? - Krumelur
innerViews?你的意思是rootViewController和detailViewController? - Luke Mcneice


我是通过制作一个方法来实现的 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就像你的岳母,你真的不喜欢它们,当你不得不使用它们时,你必须小心翼翼地绕过地雷。


2
2017-10-17 12:19



- 你的评论“SplitViews就像你的岳母,......”真是太棒了:-) - Ekra


试试这个,它对我有用

1)在app delegate的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)在app的委托中添加交换视图控制器,将根视图交换为拆分viewcontroller。

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

3)在登录视图中调用swapToViewControllers。


2
2018-06-19 07:48



在RootViewControllerType中需要给出什么? - sairam


请记住,HIG强烈建议您支持所有方向。除非你有非常非常好的理由支持景观,否则你可能会被拒绝。

见HIG第19页: http://developer.apple.com/library/ios/documentation/General/Conceptual/iPadHIG/iPadHIG.pdf


0
2017-10-11 19:46



谢谢戴夫。我的应用程序将更多地在企业内部使用。 (它不会被普遍使用。虽然我必须通过应用商店批准程序,对吧)是否足够好? - Nnp
取决于您希望它的分布范围。我为部署在少数设备上的客户开发了内部校对概念应用程序,以向少数高管展示。我们完全无法以这种方式避免应用商店流程。但是,如果您正在开发将在整个企业中分发的内容,那么您需要看一下: developer.apple.com/programs/ios/enterprise。这是Apple企业开发人员计划。不太了解它,但我认为这可能是你想要的。 - Dave Klotz


修改了Ryan CY的故事板版本。

将此代码放入登录控制器。
1.将UISplitViewController的storyboard id设置为SplitViewController;
2.设置UISplitViewController委托并保存实例

UISplitViewController* splitController = [self.storyboard instantiateViewControllerWithIdentifier:@"SplitViewController"];
UINavigationController* navigationController = [splitController.viewControllers lastObject];
splitController.delegate = (id)navigationController.topViewController;



0
2017-10-01 15:11