iPhone 加载了错误的情节提要

Wrong Storyboard loads on iPhone

我的应用适合 iPad 和 iPhone。由于尺寸差异,设备之间的布局完全不同,我选择了两个不同的故事板。

除了我自己的 iPhone SE(第 2 代),在模拟器和真实设备上一切正常,但它在我妻子的 iPhone SE(第 2 代)上确实有效。起初,我以为这只是我的设备问题,但本周我最大的客户之一竟然遇到了同样的问题。他使用 iPhone 11.

在我的 SceneDelegate 中,我使用以下代码检查哪个设备用于 select 正确的故事板:

var storyboard: UIStoryboard {
    switch UIDevice.current.userInterfaceIdiom {
    case .phone:
        print("This is an iphone")
        return UIStoryboard(name: "Main-iPhone", bundle: nil)
    case .pad:
        print("This is an  ipad")
        return UIStoryboard(name: "Main-iPad", bundle: nil)
    default:
        print("This is default")
        return UIStoryboard(name: "Main", bundle: nil)
    }
}

window?.rootViewController = storyboard.instantiateInitialViewController()
window?.makeKeyAndVisible()

guard let _ = (scene as? UIWindowScene) else { return }

我通过打印语句检查选择。这里一切都还很顺利。当涉及 iPhone 时,我在 ViewController 中使用相同的 switch 语句来触发不同的行为。连接来自 UI 的未知元素时应用程序崩溃。

结果是加载了 iPad 的情节提要,而不是 iPhone 的情节提要。即使我为每个故事板提供 ViewController,我设备上的应用程序仍会继续加载错误的故事板。

我已经多次从我的设备上删除了该应用程序。打开和关闭设备。故事板被删除并再次添加。干净的构建文件夹。删除派生数据。但没有任何帮助。

有人认识这个问题吗?

非常感谢

您在部署信息配置中设置的主界面是哪个界面?如果问题只发生在手机上,您可以尝试将 Main-iPhone 设置为您的主界面,并且仅在 SceneDelegate

中为 iPad 覆盖它

首先,确保您已删除 info.plist 中对 主界面 故事板名称 的所有引用。

按原样使用您的代码,我没有看到 print() 语句...

尝试将其更改为:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    guard let windowScene = (scene as? UIWindowScene) else { return }
    window = UIWindow(windowScene: windowScene)

    var storyboard: UIStoryboard {
        switch UIDevice.current.userInterfaceIdiom {
        case .phone:
            print("This is an iphone")
            return UIStoryboard(name: "Main-iPhone", bundle: nil)
        case .pad:
            print("This is an  ipad")
            return UIStoryboard(name: "Main-iPad", bundle: nil)
        default:
            print("This is default")
            return UIStoryboard(name: "Main", bundle: nil)
        }
    }
    
    window?.rootViewController = storyboard.instantiateInitialViewController()
    window?.makeKeyAndVisible()
    
}