swiftdelegatesprotocolsdelegation

Delegate becomes nil from one class to another


I have this protocol and class which is the delegator L

protocol userDetailsDelegate: AnyObject {
    func didSendUserDetails ( _ object: LoginViewController)
}

class LoginViewController: UIViewController {
    var details: loginDetails?
    var userdelegate: userDetailsDelegate?

    func loginRequestrd() {
        // ALOT OF CODE ABOVE BUT THE DATA BELOW SURE COMES

        guard let logdetails = try? JSONDecoder().decode(loginDetails.self, from: data) else {
//                        print("====")
            return
        }

        self.details = loginDetails(status: logdetails.status, message: logdetails.message, id: logdetails.id, username: logdetails.username, email: logdetails.email, fullname: logdetails.fullname, ava: logdetails.ava)
        // THE DETAILS COME AS RESPONSE NO ISSUE
        self.didSendUserData()

        DispatchQueue.main.async {
            self.navigationController?.pushViewController(HomePageViewController(), animated: true )
        }
    }

    func didSendUserData () {
        guard let userdetails = details else {
            return
        }
        userdelegate?.didSendUserDetails(self)
    }
}

I have this class also which is the delegate:

class HomePageViewController: UITabBarController {
    var userdetails: loginDetails?
    var posttitle: String?
    var loginview: LoginViewController?

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .systemBackground
           UITabBar.appearance().barTintColor = .systemBackground
           tabBar.tintColor = .label
        DispatchQueue.main.async {
            self.setupVCs()
        }
        loginview?.userdelegate = self
        loginview?.loginRequestrd()
    }
}

Conforming to the userDetailsDelegate protocol

extension HomePageViewController: userDetailsDelegate   {
    func didSendUserDetails(_ object: LoginViewController) {
        self.userdetails = object.details
    }
}

The userdetails in the delegate class comes as nil. Not sure what I am missing in the protocol conformance.


Solution

  • When you call this method (didSendUserData) here

        // THE DETAILS COME AS RESPONSE NO ISSUE
        self.didSendUserData()
    
    ===
    func didSendUserData () {
        guard let userdetails = details else {
            return
        }
        userdelegate?.didSendUserDetails(self)
    }
    

    userdelegate is nil and you can fix this by

        self.details = loginDetails(status: logdetails.status, message: logdetails.message, id: logdetails.id, username: logdetails.username, email: logdetails.email, fullname: logdetails.fullname, ava: logdetails.ava)
        // THE DETAILS COME AS RESPONSE NO ISSUE
         let vc = HomePageViewController()
        self.userdelegate = vc
        self.didSendUserData() 
        DispatchQueue.main.async {
            self.navigationController?.pushViewController(vc, animated: true )
        }
    

    But You need to send data from login screen to home , here no delegate is needed , you only need to forward data through properties

        // THE DETAILS COME AS RESPONSE NO ISSUE
        //self.didSendUserData() // remove this line
    
        DispatchQueue.main.async {
          let vc = HomePageViewController(
          vc.userdetails = loginDetails(status: logdetails.status, message: logdetails.message, id: logdetails.id, username: logdetails.username, email: logdetails.email, fullname: logdetails.fullname, ava: logdetails.ava)
          self.navigationController?.pushViewController(vc, animated: true )
        }