摘要
剛創建一個新的項目,在
AppDelegate
中設置rootViewController
來確定應用的首頁是一個最基本的處理,因爲是不常操作的處理,所以容易忽略其中的某個步驟,導致無法設置成功。所以記錄下來,以備快速查找。
剛創建一個 iOS 項目,會先設置應用的 rootViewController
,也就是應用的首頁。一般的操作代碼如下:
// UIViewController 爲首頁控制器
let homeNav = UINavigationController.init(rootViewController: UIViewController.init())
window?.rootViewController = homeNav
window?.makeKeyAndVisible()
這三行代碼需要寫在 AppDelegate
的 application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
函數中。
當完成以上步驟之後,會發現這裏沒有 window
對象,那就需要在 AppDelegate
中設置 window
屬性變量:
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
......
}
到這裏,項目工程就沒有報錯,就正常運行應用,漫長的編譯、初始化和啓動應用的過程後,發現首頁並不是自己設置的控制器。
接下來排查問題,最上面的三行代碼也是執行了,就是打斷點看 window
對象,window
也不是 nil
。查找好久,發現還需要在做一步處理。
就是到項目工程中,選擇 Info
選項,看到 Custom iOS Target Properties
列表中,刪除 Application Scene Manifest
選項。
這時候,再運行工程,可以成功的跳轉到自己設置的首頁了。
那麼,Application Scene Manifest 是什麼,爲什麼會影響到設置首頁呢?
查找開發文檔,看到 UIApplicationSceneManifest 選項的解釋,在詳細的解釋中找到了答案:若在 plist 文件中設置這個選項,那麼應用就支持 scenes
,並且不能在 AppDelegate
中處理頁面的切換。
Discussion
The presence of this key indicates that the app supports scenes and does not use an app delegate object to manager transitions to and from the foreground or background.
新創建項目工程的時候,會發現除了 AppDelegate.swift
文件之外,還有一個 SceneDelegate.swift
文件。並且這個文件只能在 iOS 13 及以上纔可以使用。現在還不是很確定這兩個文件的聯繫和區別,在什麼樣的場景中使用 SceneDelegate
對象,等後面再多瞭解些,再去使用它。
題外話
時間倉促,說的東西可能不全面,在你查看的過程中遇到什麼問題,評論區給我留言,我會盡快回復。