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()
}
我的应用适合 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
首先,确保您已删除 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()
}