![](/img/trans.png)
[英]Passing data between Tab Bar Controllers with NSNotificationCenter in Swift
[英]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.