如何在 Xcode 11 中启动没有故事板 >= iOS 13 的新项目?
Posted
技术标签:
【中文标题】如何在 Xcode 11 中启动没有故事板 >= iOS 13 的新项目?【英文标题】:How to launch new project without a storyboard >= iOS 13 in Xcode 11? 【发布时间】:2019-11-01 08:00:05 【问题描述】:Xcode 11 与 ios 13 现在启动时的设置与以前略有不同,将许多功能从 AppDelegate.m 文件移动到名为 SceneDelegate.m 的新文件中 - 删除 Main.storyboard 并在 AppDelegate 中设置根视图控制器是不再是一个选项,导致以下错误:
-[AppDelegate window]: unrecognized selector sent to instance
如何在没有情节提要的情况下继续构建新项目?
【问题讨论】:
【参考方案1】:查看这篇文章:Xcode 11.3 | [从项目中移除情节提要][1]
第 1 步: 删除情节提要
成功创建新项目后,导航到 Xcode 窗口左角的 Project Navigator。我们需要从这里删除 Main.storyboard 文件。
第 2 步: 删除主界面
然后移动到常规选项卡并在此处删除您的主界面链接并按回车键。
第 3 步: 从 Info.plist 中删除 Storyboard 文件。
从 Info.plist 中删除 Main.storyboard。
第 4 步: 让您的应用在没有 Storyboard 的情况下运行。
如果您在 Project Navigator 中仔细看过,您可以看到 2 个委托文件 AppDelegate.swift 和 SceneDelegate.swift。所以在之前的 Xcode 中,我们已经看到 AppDelegate.swift 中存在 UIWindow 变量,而现在对于 Xcode 11,它已经消失了。现在您可以在 SceneDelegate.swift 文件中看到 window 变量。 在此文件中,您需要为加载 xib 文件进行配置。
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
guard let windowScene = (scene as? UIWindowScene) else return
window = UIWindow(frame: windowScene.coordinateSpace.bounds)
window?.windowScene = windowScene
window?.rootViewController = ViewController()
window?.makeKeyAndVisible()
?就是这样! 现在您可以在没有 Storyboard 的情况下运行您的应用程序。
GitHub sample project
【讨论】:
【参考方案2】:我正在运行 Xcode 11.4 并在 Objective-C 中运行它 第 1 步:删除情节提要 第 2 步:删除主界面 第 3 步:删除 info.plist 中的情节提要 第 4 步:在 Xcode11 中新增 SceneDelegate 在所有 cmets 之后,我将此添加到 -(void)scene 方法中:
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.windowScene = (UIWindowScene *)scene;
self.window.rootViewController = [[UINavigationController alloc]
initWithRootViewController:ViewController.new];
//self.window.rootViewController = [[ViewController alloc]init];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
如您所见,这将 viewController 嵌入到 navigationController 中,但下面是没有的设置。 希望这会有所帮助
【讨论】:
谢谢!我试图在 obj-c 中初始化窗口时设置窗口场景,而不是稍后设置属性,但是在点击文本字段时键盘没有出现。这为我解决了问题。【参考方案3】:以上所有答案都应该适合您。 1.删除Main.storyboard 2.删除info.plist中对Main.storyboard的引用 3. 添加窗口到SceneDelegate 4.设置rootviewcontroller
如果您需要视觉效果,请查看我作为来源链接的视频。
来源:https://youtu.be/2oo0tO1E9ys
【讨论】:
【参考方案4】:答案已经有问题:您需要添加窗口属性。 Xcode 11 不会生成它。
【讨论】:
【参考方案5】:您仍然可以在 Xcode 11 中使用 this empty application template。
【讨论】:
【参考方案6】:第 1 步:
在 SceneDelegate.swift 中:
替换这一行:
guard let _ = (scene as? UIWindowScene) else return
用这个:
guard let windowScene = (scene as? UIWindowScene) else return
window = UIWindow(windowScene: windowScene)
window?.rootViewController = ViewController()
window?.backgroundColor = .systemBackground // optional
window?.makeKeyAndVisible()
第 2 步: 从 info.plist 中删除这两个条目:
“应用场景清单...”下的“故事板名称”
“主情节提要文件基本名称”
第 3 步。 删除 Main.storyboard 文件
【讨论】:
以上是关于如何在 Xcode 11 中启动没有故事板 >= iOS 13 的新项目?的主要内容,如果未能解决你的问题,请参考以下文章
Xcode12 SwiftUI 项目创建 LaunchScreen 故事板