场景 - 根据 iPad 或 iPhone 使用专用的故事板

Scenes - Use dedicated Storyboards depending iPad or iPhone

Apple 现在希望我们使用“场景”而不是 windows 和屏幕来显示 iPad 和 iPhone 中的内容。现在添加了对场景的支持后,我似乎失去了使用情节提要 iPad 或 iPhone 的能力?

我在 plist 中设置我的场景是这样的:

这是从一个新项目复制而来的,因为 Apple 似乎忘记记录如何将场景添加到现有应用程序。 Apple 没有充分记录的另一个例子!

现在我似乎已经无法使用 iPad 和 iPhone 的不同故事板了。

虽然我可以为 iPad 使用与 iPhone 相同的故事板,但我的应用程序在 iPad 的专用界面下看起来更好,因为我使用它提供的额外空间可提供更好的最终用户体验。 iPhone 很好,该界面最适合小显示器,但在 iPad 上看起来很贫乏。

求助!

可能有更好的方法来执行此操作,但搜索时我找不到任何其他人介绍此内容。因此,我在这里提供已被 App Store 接受的解决方案,供其他人审查、使用、改进,最重要的是,不要浪费任何时间去寻找可能不存在的解决方案!

我解决这个问题的方法是添加另一个故事板和视图控制器来处理它是 iPhone 还是 iPad 的决定,然后立即加载目标故事板。我称此为“进入决定”。唯一的问题是在关闭后续视图时,您必须确保操作正确,否则您最终会回到“进入决定”。如果是空白视图,您的最终用户可能会被卡住。因此,为了确保用户永远不会真正被卡住,我在那个视图中放置了按钮,这样他们就可以在它出现时手动导航,如果 Apple 进一步改变了我们不知道的线。最好现在覆盖它。

第一步,创建一个新的故事板,“入口决定”:

因为我是一个好人,所以我向用户解释这是一个错误并道歉。我还给了他们两个按钮,iPad 和 iPhone。理论上,如果一切顺利,最终用户将永远不会看到这一点,但我们最好能免费覆盖这种可能性。

第 2 步,一旦加载视图控制器,就让它移动到我们真正想要的正确故事板。

-(void)viewDidLoad {

// Need to decide which storyboard is suitable for this particular method.
// Loading from class: 

if ( [UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad )
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil];
    ViewController *detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"myViewController"];
    [self.navigationController pushViewController:detailViewController animated:YES];
}
else
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    ViewController *detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"myViewController"];
    [self.navigationController pushViewController:detailViewController animated:YES];
}

}


- (IBAction)pickediPhone:(id)sender {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    ViewController *detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"myViewController"];
    [self.navigationController pushViewController:detailViewController animated:YES];
}

- (IBAction)pickediPad:(id)sender {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil];
    ViewController *detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"myViewController"];
    [self.navigationController pushViewController:detailViewController animated:YES];
}

这并没有什么特别之处,因为它是检测哪个设备然后加载正确的故事板的组合。为了全面披露,我引用了我用于加载这些故事板的原始代码。

另外两种方法只是按下按钮,为了完整起见,此处显示。

第 3 步,将 plist 中的场景配置更新为目标 Entry Decision 而不是 Main。

您的目标是不同的情节提要,因此需要更新。

第 4 步,return正在返回主屏幕。

在我的应用程序中,我有一个欢迎屏幕,然后是 table 视图或其他视图,具体取决于它是什么。某些类型可以毫无问题地工作,但由于我使用的是导航控制器,因此我需要正确地 return。因此,这个最适合主屏幕的最终“返回”命令:

[self.navigationController popViewControllerAnimated:YES];

其他选项要么回到进入决策(我们为了以防万一而覆盖的错误)或什么都不做:

[self.navigationController popToRootViewControllerAnimated:YES];
[self dismissViewControllerAnimated:YES completion:NULL];

这就是我能够使用我现有的故事板的方式,在这个应用程序的生命周期中,这些故事板已经针对 iPhone 和 iPad 进行了完美的调整,并且仍然能够支持苹果的愿望转移到场景。我的应用程序需要将场景用于其他目的,因此我别无选择,只能走这条路。我进行了多次尝试,试图在加载场景时捕获它们,但初始场景似乎是在没有你(程序员)的情况下加载的,你没有获得关于它应该如何或使用哪个的任何选项。您需要此预览控制器来恢复该功能,这是目前在 App Store 中有效的一种解决方案。

乖一点。

Now I seem to have lost the ability to use different storyboards for iPad from iPhone

这很简单(而且,正如您所说,没有记录)。您的 Info.plist 中需要两个完全独立的场景清单条目,即 UIApplicationSceneManifestUIApplicationSceneManifest~ipad。它们只是指定了不同的 UISceneStoryboardFile 值,并且您已经像场景出现之前一样设置好了。