簡體   English   中英

Swift 3 / Xcode 8.2 - viewDidLoad中的切換視圖不起作用

[英]Swift 3 / Xcode 8.2 - switch view in viewDidLoad not working

我想在用戶登錄時切換加載ViewController。問題:當用戶等於“true”時,視圖沒有改變...

先感謝您!!

override func viewDidLoad() {
    super.viewDidLoad()

    var user: String?
    user = UserDefaults.standard.value(forKey: "loginSuccessfull") as? String

    if user == "true" {
        let vc = self.storyboard?.instantiateViewController(withIdentifier: "SecondView") as UIViewController!
        self.show(vc!, sender: vc)
    }

    // Do any additional setup after loading the view, typically from a nib.
}

viewDidLoad方法中刪除代碼並使用以下方法。

 override func viewDidAppear() {
     guard let user = UserDefaults.standard.string(forKey: "loginSuccessfull"), user == "true" else {
      return
     }
     let vc = self.storyboard?.instantiateViewController(withIdentifier: "SecondView")!
     self.present(vc, animated: true)
 }

您應該在viewWillAppear()viewDidAppear()顯示您顯示第二個View Controller的代碼。

override func viewDidAppear() {
    super.viewDidAppear()

    var user: String?
    user = UserDefaults.standard.value(forKey: "loginSuccessfull") as? String

    if user == "true" {
        let vc = self.storyboard?.instantiateViewController(withIdentifier: "SecondView") as UIViewController!
        self.show(vc!, sender: vc)
    }

    // Do any additional setup after loading the view, typically from a nib.
}

原因是在viewDidLoad()期間,您的ViewController的某些屬性尚未定義,並且尚未准備好呈現另一個ViewController。

你需要使它成為異步,不需要任何延遲,就像這樣:

 override func viewDidLoad() {
    super.viewDidLoad()

    var user: String?
    user = UserDefaults.standard.value(forKey: "loginSuccessfull") as? String

    DispatchQueue.main.asyncAfter(deadline: .now()) {
        if user == "true" {
            let vc = self.storyboard?.instantiateViewController(withIdentifier: "SecondView") as UIViewController!
            self.show(vc!, sender: vc)
        }
    }

}

而不是在viewDidLoad中編寫邏輯,在呈現當前viewcontroller之前編寫它

例如,如果要在應用程序啟動時檢查它,請檢查用戶是否已登錄didFinishLaunching方法並相應地設置rootViewController。

如果想要從其他viewController中呈現它,首先檢查用戶登錄狀態並相應地顯示viewcontroller,而不是檢查viewDidLoad。

此外,您可以通過在一些延遲后執行操作來呈現視圖控制器。

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
        // present view contoller
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM