代表不工作

时间:2017-05-03 08:16:54

标签: ios swift swift3 delegates

我有这个快速的代码,我创建了一个委托,但这不能正常工作。我不明白我错在哪里

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

感谢您的帮助!!

2 个答案:

答案 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()
    }

}

没有它,你可能会有内存泄漏/僵尸对象永远不会被释放