我有一个类MapEvents
,它符合两种不同的协议。第一个定义在与MapEvents相同的文件中:
protocol HandleMapPopupBehavior: class {
func hideContainer()
}
另一个在不同的文件中。我的类符合它如下:
class MapEvents: UIViewController, ContainerToMaster, HandleMapPopupBehavior {
var userProfile: YourFullUser?
override func viewDidLoad() {
super.viewDidLoad()
userProfile = YourFullUser()
userProfile?.delegate = self
}
func hideContainer() {
print("hiding container now")
}
(...)
}
正如你所看到的,我试图在这里分配一个代表:
userProfile = YourFullUser()
userProfile?.delegate = self
然而,当在不同的类中,我想引用这个委托对象时(通过执行:
class YourFullUser: UIViewController {
weak var delegate: HandleMapPopupBehavior?
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
delegate?.hideContainer()
}
}
)
我在delegate
上得了零分。
我相信这是因为在我的MapEvents
类中,我没有专门设置要分配userProfile?.delegate
给哪个委托,而且self
不够具体——
所以我的问题是如何确保userProfile?.delegate = self
指的是HandleMapPopupBehavior
而不是ContainerToMaster
?
===========编辑
根据@Rob的建议,我仔细检查了代码,以检查是否不止一次设置了YourFullUser
。我发现了这段代码,它从一个ViewController引导到YourFullUser
:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "fullYourRequestSegue"){
if let fullUserDetails = segue.destinationViewController as? YourFullUser
{
fullUserDetails.descrLabel = self.descr
fullUserDetails.photo = self.photo
fullUserDetails.usernameLabel = self.username
}
}
}
所以我假设我有两个YourFullUser
实例——这会影响我的委托对象稍后成为nil
吗?
你说:
所以我假设我有两个
YourFullUser
实例——这会影响我的委托对象稍后为零吗?
是的。userProfile
正在实例化一个未连接到任何东西的YourFullUser
,您正在该实例上设置delegate
。然后,在执行segue时,会创建一个新的YourFullUser
实例,其delegate
为nil
。
我建议完全停用userProfile
变量。在prepareForSegue
之前不要设置delegate
,只为那里的fullUserDetails
设置delegate
。
例如:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "fullYourRequestSegue" {
if let fullUserDetails = segue.destinationViewController as? YourFullUser {
fullUserDetails.delegate = self
fullUserDetails.descrLabel = self.descr
fullUserDetails.photo = self.photo
fullUserDetails.usernameLabel = self.username
}
}
}
关键的一点是,您不应该预先设置delegate
,而是将其推迟到调用prepareForSegue
并且情节提要片段为您实例化了目标视图控制器时。