我有一个SVC设置,效果很好。 SPC的主视图和详细视图都是UINavigationControllers,每个都有单独的根视图控制器。
我的应用程序运行正常。我可以在纵向或横向模式下启动它,一切都可以正常工作。 “主”弹出按钮在纵向模式下可见,但在横向模式下隐藏。主平面和细节平面都有动画和正确旋转,没有弹出或奇怪的动画工件存在,并且一切都正确拉伸。每个规格100%满意。
更换详细视图控制器时出现问题。由于我们无法替换uinavi控制器的根节点,我所做的是创建一个全新的UINavigationController
,在详细视图中为其指定我想要的新视图。我这样做是因为详细视图中的视图可以做1-2-3级深度,但我需要能够分配唯一的“根”视图(例如,我需要能够完全替换根UINavigationController
)。
代码如下所示:
self.detailViewController = [[SomeNewController1of3 alloc] initWithNibName:@"SomeNewController1of3" bundle:nil];
self.splitViewController.delegate = self.detailViewController;
UINavigationController *newNC = [[UINavigationController alloc] initWithRootViewController:self.detailViewController];
self.splitViewController.viewControllers = @[navigationController, newN];
首先,我创建了新的viewcontroller,无论它是什么。然后我将splitviewcontroller的委托设置为=新创建的viewcontroller(以便willHideViewController
等触发)。然后我创建一个navicontroller来容纳新创建的viewcontroller,以便它可以从中推送和弹出。最后,我用我的新导航控制器替换了拆分视图控制器的第二个(细节)视图。
同样,当我从风景开始时,这个计划完美无瑕。
当我以肖像画开始时,这些是我注意到的异常现象:
willHideViewController
未被上述方法调用。我没有得到的是为什么当我从风景开始时一切都表现得完美无缺,但所有这些错误都出现在肖像中?我的所有视图实际上都在IB中将默认方向设置为纵向,并且是适合缩放的。它也不像是疯狂的界面,它们都只是股票表格。
你们有没有遇到过这个问题或找到了解决方法?
答案 0 :(得分:1)
首先,UISplitViewController
委托应该是顶级对象,例如您的应用程序委托,而不是拆分控制器显示的视图控制器。
其次,要回答您的问题,要替换纵向显示的详细视图控制器(即,按在主导航上),可以使用拆分控制器委托方法:
AppDelegate.m
- (BOOL)splitViewController:(UISplitViewController *)splitViewController showDetailViewController:(UIViewController *)vc sender:(id)sender{
if(!splitViewController.isCollapsed){
return NO;
}
UINavigationController *masterNav = splitViewController.viewControllers.firstObject;
if(![masterNav.topViewController isKindOfClass:UINavigationController.class]){
return NO;
}
UINavigationController *existingDetailNav = (UINavigationController *)masterNav.topViewController;
UINavigationController *newDetailNav = (UINavigationController *)vc;
existingDetailNav.viewControllers = @[newDetailNav.viewControllers.firstObject];
return YES;
}
您可能想知道为什么我们不仅仅替换主导航堆栈。问题是,拆分视图控制器从上次通过其默认行为的showDetail保留了细节视图控制器。因此,如果我们是肖像人,则在一个单元格上轻按以显示细节,然后替换该细节,然后向后导航,然后旋转以将其变为风景时,旧的细节将显示在右侧而不是新的。通过如上所述用新的详细信息控制器替换详细信息导航堆栈,可以解决此问题,因为尽管拆分显示了保留的详细信息导航,但现在它包含了新的详细信息。
答案 1 :(得分:0)
我发现继承SplitViewController更容易。从那里,你可以轻松地交换细节,为那些需要它的人添加一个navController。
子类UISplitViewController并将您的根splitViewController设置为该类。然后将此方法添加到UISplitViewController子类:
-(void)setDetailControllerTo:(UIViewController *)detailController withNavControllerTitle:(NSString *)title {
[detailController view]; // this line forces the viewDidLoad method to be called
if (title) {
UINavigationController *navController = [[UINavigationController alloc] init];
[navController pushViewController:detailController animated:YES];
detailController.title = title;
NSArray *viewControllers=@[self.mainController.viewControllers[0],navController];
self.mainController.viewControllers = viewControllers;
} else {
NSArray *viewControllers=@[self.mainController.viewControllers[0],detailController];
self.mainController.viewControllers = viewControllers;
}
}
要调用此方法,请从tableView中的主视图控制器执行以下操作:didSelectRowAtIndexPath:method
FixedSplitViewController *splitController = (FixedSplitViewController*) self.splitViewController;
CurrentEventViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"CurrentEventViewController"];
// add any setup code here
[splitController setDetailControllerTo:controller withNavControllerTitle:@"Current Event"];
如果您希望在纵向旋转中保持主视图可见,请将此方法添加到SplitViewController子类中:
-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation {
return NO;
}