您可以在应用程序/场景委托中设置窗口并仍然使用情节提要吗?

Posted

技术标签:

【中文标题】您可以在应用程序/场景委托中设置窗口并仍然使用情节提要吗?【英文标题】:Can you set the window in the app/scene delegate and still use storyboard? 【发布时间】:2022-01-22 14:18:15 【问题描述】:

我有一个应用程序,我正在尝试制作一个简单的 collectionView。如果我使用 is initial View Controller 从 Main.storyboard 运行,collectionView 工作正常。

问题是当我使用此代码制作自己的窗口时:

class AppDelegate: UIResponder, UIApplicationDelegate 

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
    let window = UIWindow(frame: UIScreen.main.bounds)
    window.makeKeyAndVisible()
    window.rootViewController = ViewController()
    self.window = window
    return true

class SceneDelegate: UIResponder, UIWindowSceneDelegate 

var window: UIWindow?


func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 
    guard let windowScene = (scene as? UIWindowScene) else  return 
    let window = UIWindow(windowScene: windowScene)
    window.makeKeyAndVisible()
    window.rootViewController = ViewController()

我的 collectionView 代码出现此错误:

Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

问题:

有没有办法创建自己的 UIWindow 并仍然使用故事板?

P.S 如果您想知道为什么我不只使用故事板而不是制作自己的 UIWIndow,那是因为我已经完全以编程方式创建了我的应用程序,我只需要使用故事板这一次来调整 UICollectionViewCells 的大小。我无法弄清楚如何以编程方式进行,但我已经在情节提要上弄清楚了。

【问题讨论】:

您是否尝试从 appDelegate 和 scenedelegate 设置根视图控制器? 【参考方案1】:

SceneDelegateApp DelegateStoryboard 设置您的根视图控制器,您不必在所有地方都这样做。

如果您只是想从代码初始化ViewController,则不需要任何情节提要,并且您称为 ViewController() 的初始化程序不会从情节提要中实例化视图控制器。要了解如何实例化与情节提要关联的视图控制器,请参阅link。

您可以使用任何视图控制器作为根视图控制器,这取决于您。

isInitialViewController 将该视图控制器设置为窗口的根视图控制器。

如果您只想使用您的 ViewController 作为您已经在应用程序委托中编码的根视图控制器,现在只需从 info.plist 文件中删除情节提要及其引用即可。

【讨论】:

以上是关于您可以在应用程序/场景委托中设置窗口并仍然使用情节提要吗?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 在情节提要中设置 UIButton setBorderColor

在情节提要中设置时,UISearchBar 不显示范围栏

在单独的文件中设置 UITableView 数据源和委托 - swift

我应该如何确定 UIKit 将打开哪个场景,以便我可以在正确的窗口中设置我的 UI? (iOS 13+)

在 Xcode 8.2 中设置特定于设备的字体

即使在钥匙串安全之后,仍然可以在代码中设置凭据