簡體   English   中英

快速將數據從ViewController傳遞到選項卡查看的控制器

[英]Passing data from viewcontroler to tab viewed controllers in swift

我有這個登錄表格:

import UIKit

class LoginViewController: UIViewController {
var user : LoginUser?
    @IBAction func btnLoginPressed(_ sender: Any) {
        if self.textFieldLogin.text?.isEmpty ?? true || self.textFieldPassword.text?.isEmpty ?? true  {
            self.errorLoginMessage(txt: "Error", title: "Error")
        } else {
            let cms = ServerConnect()
            cms.checkUsersLogin(login: self.textFieldLogin.text, password: self.textFieldPassword.text, completion: { (data) in

                switch(data) {
                case .succes(let data):
                    var actionToRun: ()-> Void

                    let decoder = JSONDecoder()
                    self.user = try? decoder.decode(LoginUser.self, from: data)
                    dump(self.user)

                    // we have an user
                    if ((self.user?.id ) != nil) {
                        actionToRun = {
                            self.performSegue(withIdentifier: "toLoginUser", sender: self)
                        }
                    }
                        // we have an error
                    else if let json = try? JSONSerialization.jsonObject(with: data, options: []),
                        let dictionary = json as? [String: Any],
                        let message = dictionary["komunikat"] as? String,
                        let title = dictionary["error"] as? String {
                        // we have an error
                        actionToRun = {
                            self.errorLoginMessage(txt: message, title: title)
                        }
                    }
                        // default error
                    else {
                        actionToRun = {
                            self.errorLoginMessage(txt: "Podany login lub hasło jest błędny!!", title: "Błąd")
                        }
                    }

                    DispatchQueue.main.async {
                        actionToRun()
                    }

                case .error(let error):
                    print("Error 104: \(error)")
                }

            })
        }
    }


    override func prepare(for segue: UIStoryboardSegue, sender: Any?){
        if segue.identifier == "toLoginUser" {

                        let storyboard = UIStoryboard(name: "Main", bundle: nil)
                        let tabVC = storyboard.instantiateViewController(withIdentifier: "MainVC") as! UITabBarController
                        self.present(tabVC, animated: true, completion: {
                            let vc = tabVC.selectedViewController as! NewsViewController
                            vc.loggedUser = self.user
                        })

        }
    }

    func errorLoginMessage(txt: String, title: String){
        let alertController = UIAlertController(title: title, message: txt, preferredStyle: .alert)
        alertController.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: { (action: UIAlertAction!) in

        }))
        self.present(alertController, animated: true, completion: nil)
    }

}

該對象已正確構建。 我想將我的對象從登錄視圖傳遞到選項卡查看的控制器。

我收到這樣的對象:

class NewsViewController: UIViewController {

    var loggedUser : LoginUser?

    override func viewDidLoad() {
        super.viewDidLoad()
        print("check object: \(loggedUser)")
        dump(loggedUser)
    }

    @IBAction func testBtnPressed(_ sender: Any) {
        print("check object: \(loggedUser)")
        dump(loggedUser)
    }


}

不幸的是,這段代碼不起作用,我總是得到零。

我的完整源代碼是: https : //bitbucket.org/trifek/karta-nauka/src/master/

我可以尋求幫助嗎?

將信息視圖控制器傳遞給視圖控制器並不是一個好主意,幾乎所有視圖控制器都使用該信息

類似於登錄信息,其中包含幾乎所有屏幕都使用的信息

好的主意是創建Global Shared類,該類將存儲您在應用程序之間共享的所有全局信息。

public final class AppGlobalManager { 

   static let sharedManager = AppGlobalManager()


    var loggedUser : LoginUser?


}

現在,無論何時用戶登錄,您都可以

 AppGlobalManager.sharedManager.loggedUser = object

當用戶注銷時

 AppGlobalManager.sharedManager.loggedUser = nil

希望對您有所幫助

如果您已經在情節提要中使用segues,則不必從UIStoryboard獲取所需的視圖控制器,segues本身提供了destination視圖控制器。

例:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toLoginUser" {
        let tabVC = segue.destination as! UITabBarController
        // assuming that `NewsViewController` is the first view controller in the tabbar controller:
        let destinationViewController = tabVC.viewControllers?[0] as! NewsViewController
        destinationViewController.loggedUser = self.user
    }
}

由於您打算將LoginUser對象傳遞給選項卡視圖控制器之一,因此可以從viewControllers數組中獲取它(如上面的代碼片段所述)。

暫無
暫無

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

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