您可以在应用程序/场景委托中设置窗口并仍然使用情节提要吗?
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】:从SceneDelegate
或App Delegate
或Storyboard
设置您的根视图控制器,您不必在所有地方都这样做。
如果您只是想从代码初始化ViewController
,则不需要任何情节提要,并且您称为 ViewController()
的初始化程序不会从情节提要中实例化视图控制器。要了解如何实例化与情节提要关联的视图控制器,请参阅link。
您可以使用任何视图控制器作为根视图控制器,这取决于您。
isInitialViewController
将该视图控制器设置为窗口的根视图控制器。
如果您只想使用您的 ViewController
作为您已经在应用程序委托中编码的根视图控制器,现在只需从 info.plist
文件中删除情节提要及其引用即可。
【讨论】:
以上是关于您可以在应用程序/场景委托中设置窗口并仍然使用情节提要吗?的主要内容,如果未能解决你的问题,请参考以下文章
Swift 在情节提要中设置 UIButton setBorderColor
在单独的文件中设置 UITableView 数据源和委托 - swift