如何在 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 的新项目?的主要内容,如果未能解决你的问题,请参考以下文章

在故事板xcode中直接从视图控制器警告启动的Segues

Xcode12 SwiftUI 项目创建 LaunchScreen 故事板

如何将 Xcode 故事板表格单元格链接到其他故事板?

当我在 xcode 11 中创建一个新项目时,它没有故事板,如果我运行旧项目,它没有控制器?

iOS Xcode LaunchScreen故事板无法显示

故事板未在 Xcode 11 中删除