iOS-啓動項目(一)設置 rootViewController

摘要

剛創建一個新的項目,在 AppDelegate 中設置 rootViewController 來確定應用的首頁是一個最基本的處理,因爲是不常操作的處理,所以容易忽略其中的某個步驟,導致無法設置成功。所以記錄下來,以備快速查找。

剛創建一個 iOS 項目,會先設置應用的 rootViewController,也就是應用的首頁。一般的操作代碼如下:

// UIViewController 爲首頁控制器
let homeNav = UINavigationController.init(rootViewController: UIViewController.init())
window?.rootViewController = homeNav
window?.makeKeyAndVisible()

這三行代碼需要寫在 AppDelegateapplication(_ 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 選項。

window-image

這時候,再運行工程,可以成功的跳轉到自己設置的首頁了。

那麼,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 對象,等後面再多瞭解些,再去使用它。

題外話

時間倉促,說的東西可能不全面,在你查看的過程中遇到什麼問題,評論區給我留言,我會盡快回復。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章