Swift: 我的目标 VC segue 显示为 nil

Swift: my destinationVC segue is showing nil

我让用户通过文本字段(姓名、电子邮件等)填写一些个人资料信息,这些信息用于设置我的 ProfileContoller.shared.profile 值。当我到达我的导航 segue 以传递数据时,我的 destinationVC.profile 不会将其值设置为发送配置文件对象,而是我得到 nil。

我的 sendingVC 嵌入了导航控制器,而我的 destinationVC 嵌入了 Tab Bar 控制器。

Segue SendingVC

Attributes Inspector SendingVC

DestinationVC

// Sending View Controller: 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard let profile = ProfileController.shared.profile else { return }
    if segue.identifier == "signUpMemicTBC" {
        let destinationVC = segue.destination as? ProfileViewController
        destinationVC?.profile = profile

// Receiving ProfileViewController:
class ProfileViewController: UIViewController {

    // MARK: - IBOutlets
    @IBOutlet weak var fullNameLabel: UILabel!
    @IBOutlet weak var usernameLabel: UILabel!
    @IBOutlet weak var emailLabel: UILabel!

    // MARK: - Landing Pad
    var profile : Profile? {
        didSet {
            updateViews()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        updateViews()
    }

    func updateViews () {
        guard let profile = profile else { return }
        fullNameLabel.text = profile.firstName + " " + profile.lastName
        usernameLabel.text = profile.username
        emailLabel.text = profile.email
    }
}

// ProfileController:
class ProfileController {

    // MARK: - Properties
    var profile : Profile?

    // MARK: - Singleton
    static let shared = ProfileController()

}

我的发送对象有数据: (lldb) po 配置文件 配置文件:0x600000c873c0

目标对象意外地为零: (lldb) po destinationVC?.profile 无

didSet 在您的 vc in segue 尚未加载时触发,因此所有出口均为 nil

你需要把updateViews()放在viewDidLoad里面


另外你的目的地是一个 tabBar

let tab = segue.destination as! UITabBarController
let destinationVC = tab.viewControllers![2] as! ProfileViewController

我想你所要做的就是在主线程中调用 updateViews()

didSet {
        print("did set profile called")
        DispatchQueue.main.async{[weak self] in
            guard let self = self else {
                return
            }
            self.updateViews()
        }
    }

另一种选择是更新 viewDidLoad()

中的视图
override func viewDidLoad() {
    if let prof = self.profile {
        self.updateViews()
    }
}

您可以使用以下代码将数据安全地传递到 ProfileViewController

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard let profile = ProfileController.shared.profile else { return }
        if segue.identifier == "signUpMemicTBC" {
            guard let tabBarController = segue.destination as? UITabBarController else { return }
            guard let profileController = tabBarController.viewControllers?.index(at: 2) as? ProfileViewController else {
                return
            }
            profileController.profile = profile
        }
    }