首页 > 解决方案 > 将数据从 TabbarController 传输到 ViewController 时为零

问题描述

在此处输入图像描述看不懂是什么错误,普通用户应该注册,前提是一切都成功了,当前用户会显示在 上TabBarController,如果你想让他转换成print("\(currentUser)"),那么一切都好。该用户的协议

这里我输出到控制台,一切正常

import UIKit

class MainTabBarViewController: UITabBarController {
    
    var currentUser: MUser = MUser(username: "fdff",
                                   usersurname: "dfdf",
                                   phone: "dffd",
                                   sex: "dfb",
                                   avatarStringURL: "fgf",
                                   id: "gf",
                                   bithDate: "fggf")
    
    override func viewDidLoad() {
        super.viewDidLoad()

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let messageVC = storyboard.instantiateViewController(identifier: "MessageVC") as! MessageVC
        messageVC.currentUser = currentUser
        print("\(currentUser)")
    }

}

但是你看,我把它传给了这个控制器,在这个控制器中 nil 问题

import UIKit
import FirebaseFirestore

class MessageVC: UITableViewController {
    
    var chat = [MChat]()
    var currentUser: MUser!
   
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        print(chat[indexPath.row])
        print("\(currentUser)") // return nil
        
        let chatsVC = ChatsViewController(user: currentUser, chat: chat[indexPath.row])
        navigationController?.pushViewController(chatsVC, animated: true)
    }
    
}

谁能解释我做错了什么?

标签: iosswiftxcodedata-transfer

解决方案


解决方案

尝试MessageVC从情节提要实例化 ,然后将数据从TabBarController.

MessageVC保存全局外部的引用ViewDidLoad并将其用于导航。

例子

class MainTabBarViewController: UITabBarController {
    
    var currentUser: MUser = MUser(username: "fdff",
                                   usersurname: "dfdf",
                                   phone: "dffd",
                                   sex: "dfb",
                                   avatarStringURL: "fgf",
                                   id: "gf",
                                   bithDate: "fggf")
    // Declare Message VC instance
    var messageVC : MessageVC!
    
    override func viewDidLoad() {
        super.viewDidLoad()

       // Instantiate from Storyboard
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        messageVC = storyboard.instantiateViewController(identifier: "VCIdentifier")
        messageVC.currentUser = currentUser
        print("\(currentUser)")
    }

}

更新:从 TabBarController 访问子 ViewController

func accessMessageVC() {
    // Use your viewcontroller index.
    let vc = self.viewControllers![2] as! MessageVC
    messageVC.currentUser = currentUser
}

从 TabBarController 调用此方法ViewDidLoad


推荐阅读