gpt4 book ai didi

iphone - SplitViewController 问题 - 在纵向模式下替换详细 View Controller 失败

转载 作者:行者123 更新时间:2023-12-03 21:16:41 25 4
gpt4 key购买 nike

我有一个运行良好的 SVC 设置。 SPC 的主视图和详细 View 都是 UINavigationController,每个 View 都有单独的 Root View Controller 。

我的应用程序运行良好。我可以以纵向或横向模式启动它,一切正常。 “主”弹出按钮在纵向模式下可见,但在横向模式下隐藏。主平面和细节平面都可以正确设置动画和旋转,不存在弹出或奇怪的动画伪像,并且所有内容都可以正确拉伸(stretch)。每个规范 100% 满意。

当我更换详细 View Controller 时出现问题。由于我们无法替换 uinavi Controller 的根节点,因此我所做的是创建一个全新的 UINavigationController,并在详细 View 中为其分配我想要的新 View 。我这样做是因为详细 View 中的 View 可以深达 1-2-3 层,但我需要能够分配唯一的“根” View (例如,我需要能够完全替换根 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];

首先,我创建新的 View Controller ,无论它是什么。然后,我将 splitviewcontroller 的委托(delegate)设置为 = 新创建的 View Controller (以便 willHideViewController 等触发)。然后我创建一个 navicontroller 来容纳新创建的 View Controller ,以便它可以从中推送和弹出。最后,我用新的导航 Controller 替换了分割 View Controller 的第二个(详细) View 。

再说一次,当我从横向开始时,这个计划完美无缺。

当我开始纵向拍摄时,我注意到以下异常情况:

  1. 所有弹出窗口(警报框、主视图等)都有奇怪的旋转,并且在显示时从尴尬的位置翻转。就好像它在显示这些弹出窗口时将其旋转,而不是让它们简单地“滑出”正确的位置。
  2. 当显示主视图时,在执行上述奇怪的旋转后,它会瞬间完全消失(留下黑色的空白区域),然后重新恢复到其原始位置。
  3. 在我完成设备旋转之前,详细 View Controller 上显示主视图弹出窗口的“主”按钮不会显示。通过断点确认后,我确实得出结论: willHideViewController 没有被我的上述方法调用。

我不明白的是,为什么当我从横向开始时一切都表现得完美无缺,但所有这些错误都出现在纵向?我所有的 View 实际上在 IB 中都将默认方向设置为纵向,并且按比例缩放。而且它们并不是疯狂的界面,它们都只是库存表格 View 。

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

最佳答案

首先,UISplitViewController 委托(delegate)应该是像您的 App Delegate 这样的顶级对象,而不是拆分 Controller 显示的 View Controller 。

其次,要回答您的问题,要替换纵向显示的详细 View Controller (即在主导航上推送),您可以使用拆分 Controller 委托(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;
}

您可能想知道为什么我们不直接替换主导航堆栈。问题是分割 View Controller 保留了上次 showDetail 经历其默认行为的详细 View Controller 。因此,如果我们处于纵向模式,点击单元格以显示细节,然后替换细节,然后导航回来,然后旋转到横向,旧细节将显示在右侧,而不是新细节。通过如上所述用新的细节 Controller 替换细节导航堆栈,这解决了这个问题,因为虽然分割显示了保留的细节导航,但它现在包含新的细节。

关于iphone - SplitViewController 问题 - 在纵向模式下替换详细 View Controller 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11919077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com