好比公司如今新開一個項目,使用此App的最低版本要求是iOS12。swift
(也就是說這個App上架後,只有iPhone的iOS版本是12以上的用戶才能在App Store裏面看到並下載)bash
這個時候若是咱們使用的是最新版Xcode11而且只按默認配置開發的話,會出現如下錯誤:app
'ConnectionOptions' is only available in iOS 13.0 or newer
'UIScene' is only available in iOS 13.0 or newer
'UISceneConfiguration' is only available in iOS 13.0 or newer
'UISceneSession' is only available in iOS 13.0 or newer
'UIWindowScene' is only available in iOS 13.0 or newer
...
複製代碼
Storyboard
說明:spa
Xcode11默認使用SwiftUI來作App的界面,但SwiftUI這個功能的最低要求版本是iOS13。3d
目前SwiftUI還有不少地方不太完善,我的建議若是是商業項目的話,仍是選擇Storyboard
。由於他目前仍舊是蘋果性價比比較高的一種快速開發界面的方法(較成熟+上手快)。code
這個相信你們應該輕車熟路了:App要求的最低版本是多少,這裏就選多少,再也不贅述。cdn
Surprise!編譯以後錯誤依舊視頻
AppDelegate.swift
和SceneDelegate.swift
。關於iOS13有改動或新登場的這兩個文件,在個人每一個教程的SwiftUI部分都有講到,歡迎你們來捧捧場: m.cctalk.com/inst/s9vfhe…blog
好,繼續。教程
AppDelegate.swift
文件,拉到最後的兩個方法那裏:Add @available attribute to enclosing instance method
,點Fix說明:
--從錯誤的字面意義上就能夠得知,無非就是一些類型只能在iOS13上使用,咱們如今要在低版本的iOS上使用,他天然不幹。
--Add @available attribute to enclosing instance method
的意思是:在class的某個方法前面加上@available(iOS 13.0, *)
,代表只有版本大於等於iOS13的時候才加載這個方法。
--由於AppDelegate.swift
裏的didFinishLaunchingWithOptions
方法是不管什麼版本的iOS都須要用的,因此咱們在Fix的時候不能選擇Add @available attribute to enclosing class
(在整個class前面加上@available(iOS 13.0, *)
)
SceneDelegate.swift
文件,選擇任意一個紅圈白點,點擊Add @available attribute to enclosing class
的FixSceneDelegate.swift
文件是iOS13新登場的,因此給整個class加上@available(iOS 13.0, *)
是OK的:
而且控制檯會出現:
The app delegate must implement the window property if it wants to use a main storyboard file
在iOS13中,AppDelegate
把iOS13以前的那些管理整個App生命週期等的任務都委託給了SceneDelegate
,因此原來AppDelegate
的window
屬性天然也就跑到SceneDelegate
裏面去了:
而這個SceneDelegate
class又被咱們標註了只能iOS13能夠用,也就是說iOS13如下版本的iPhone是不會執行整個SceneDelegate
class的代碼的,因此在低版本中系統就找不到window
屬性。
在AppDelegate
的class裏面聲明window
屬性:
這樣以後:
iOS13如下版本的時候,window
就走AppDelegate
這裏,不會黑屏;
iOS13或以上版本的時候,window
就走SceneDelegate
(被委託人)這裏,不會黑屏;
你們若是正好想學iOS開發的話,能夠來看看小弟的iOS視頻教程(永久更新+售後輔導): m.cctalk.com/inst/s9vfhe…