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