我有这个快速的代码,我创建了一个委托,但这不能正常工作。我不明白我错在哪里
protocol MenuDelegate {
func upateUserProfileImage()
}
// Userprofile view
class UserProfileViewController: UIViewController {
var delegate : MenuDelegate?
override func viewDidLoad() {
super.viewDidLoad()
self.delegate?.upateUserProfileImage()
}
}
class MenuViewController: UIViewController, MenuDelegate {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
func upateUserProfileImage() {
print("Work!")
}
}
感谢您的帮助!!
答案 0 :(得分:3)
未调用它的原因是,self.delegate
为nil,如果您正在呈现UserProfileViewController
,则需要设置委托,然后您将设置委托,例如
func openUserProfileViewController() {
let userProfileViewController = UserProfileViewController()
userProfileViewController.delegate = self
present....
}
在此示例中,self.delegate
中的UserProfileViewController
现在不是零,因此会回拨给您的VC
答案 1 :(得分:0)
您的代理人从未在您的代码中设置。
您可以通过替换
看到self.delegate?.upateUserProfileImage()
通过
guard let del = self.delegate else {
print("delegate is not setted - nil value")
}
del.upateUserProfileImage()
您应该按照UserProfileViewController
:
let userProfile: UserProfileViewController = UserProfileViewController() // or your instance already init
userProfile.delegate = MenuViewController() // or the instance already init somewhere in your code
加分:请注意UserProfileViewController
与委托MenuViewController
之间的保留周期,您应该使用weak
var:
class UserProfileViewController: UIViewController {
weak var delegate : MenuDelegate?
override func viewDidLoad() {
super.viewDidLoad()
self.delegate?.upateUserProfileImage()
}
}
没有它,你可能会有内存泄漏/僵尸对象永远不会被释放