我的类符合两个协议——如何为每个协议设置不同的委托

  • 本文关键字:协议 设置 两个 ios swift delegates
  • 更新时间 :
  • 英文 :


我有一个类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实例,其delegatenil

我建议完全停用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并且情节提要片段为您实例化了目标视图控制器时。

最新更新