如何在 Xcode 11 中不使用故事板(Storyboard)启动 iOS 13 及以上版本的新项目?

8
Xcode 11与iOS 13现在启动时的设置与以前略有不同,将许多功能从AppDelegate.m文件移动到一个名为SceneDelegate.m的新文件中 - 删除Main.storyboard并在AppDelegate中设置根视图控制器已不再是一个选项,导致下面的错误:
-[AppDelegate window]: unrecognized selector sent to instance

enter image description here

如何在没有故事板的情况下继续构建新项目?
6个回答

29

查看此文章:Xcode 11.3 | [从项目中删除Storyboard][1]

步骤1:删除Storyboard

成功创建新项目后,导航到Xcode窗口左上角的Project Navigator。我们需要从这里删除Main.storyboard文件。

步骤2:删除主接口

然后移动到通用选项卡并在此处删除您的主接口链接,然后按Enter键。

步骤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示例项目


2
从Xcode 14开始,您还必须清除目标→构建设置→“UIKit Main Storyboard File Base Name”。 - DanubePM

4

我正在运行Xcode 11.4,这是Objective-C方面的工作。

步骤1:删除Storyboard。

步骤2:移除主界面。

步骤3:在info.plist中删除故事板。

步骤4:由于Xcode11中引入了SceneDelegate, 所以我在-(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];

如您所见,这将视图控制器嵌入导航控制器中,但以下是不使用导航控制器的设置。
希望这可以帮助。


谢谢!我曾试图在 obj-c 中初始化窗口时设置窗口场景,而不是稍后设置属性,但当点击文本字段时键盘没有出现。这个方法解决了我的问题。 - Jon C

2
以上所有答案都适用于您。 1. 删除Main.storyboard 2. 在info.plist中删除对Main.storyboard的引用 3. 在SceneDelegate中添加窗口 4. 设置根视图控制器
如果您需要可视化效果,请查看我链接为来源的视频。
来源:https://youtu.be/2oo0tO1E9ys

1

答案已经在问题中了:您需要添加窗口属性。Xcode 11不会生成它。


1

1

步骤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中删除以下两个条目:
  • 在“Application Scene Manifest”下的“Storyboard Name”

  • “Main storyboard file base name”

enter image description here

第三步。删除Main.storyboard文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接