Delegate becomes nil from one class to another

53 views Asked by At

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.

1

There are 1 answers

0
Shehata Gamal On BEST ANSWER

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 )
    }