我有一个运行良好的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,以便它可以从中推送和弹出。最后,我用新的navi控制器替换了分割视图控制器的第二个(详细)视图。

同样,当我从风景中入手时,此计划会完美无缺。

当我开始画像时,这些是我注意到的异常:
  • 所有弹出窗口(警报框,主视图等)都有怪异的旋转,并且在显示时从尴尬的地方翻转出来。就像将这些弹出窗口在显示时一样正确旋转,而不是让它们简单地“滑出”正确的位置。
  • 当显示主视图时,执行上述怪异的旋转后,它会完全消失一会儿(留下一个黑色的空白区域),然后恢复其原始位置。
  • 在完成设备旋转之前,详细视图控制器上的“主”按钮不会显示,该按钮显示主视图的弹出窗口。在确认断点之后,我确实得出结论,上述方法未调用willHideViewController

  • 我不明白的是为什么当我从风景中入手时一切都表现得完美无瑕,而所有这些错误都是以人像出现的?实际上,我所有的视图的默认方向在IB中都设置为纵向,并且可以缩放以适合。也不像它们是疯狂的界面,它们都只是股票表视图。

    你们中有人遇到过此问题或找到过解决方法吗?

    最佳答案

    首先,UISplitViewController委托应该是顶级对象,例如您的App Delegate,而不是拆分控制器显示的视图控制器。

    其次,要回答您的问题,要替换纵向显示的详细视图控制器(即按在主导航上),可以使用拆分控制器委托方法:

    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保留了细节视图控制器。因此,如果我们是肖像人,则在一个单元上点击以显示细节,然后替换该细节,然后向后导航,然后旋转以将其变为风景时,旧的细节将显示在右侧而不是新的。通过如上所述用新的细节控制器替换细节导航堆栈,可以解决此问题,因为尽管拆分显示了保留的细节导航,但现在它包含了新细节。

    07-24 18:31