委托与类参考

时间:2016-01-14 01:29:57

标签: swift delegates protocols

如果我在A级,我想在B级运行一个函数,我可以通过多种方式完成。在我的应用程序中,我使用两种不同的方式,它们的行为不同,但我不知道为什么。 首先是通过授权。我设置了一个协议,在prepareForSegue中设置委托,然后用它从B类回调到A类: var delegateToParentVC:mainViewDelegate! delegateToParentVC.sendAsMsg(txtTask.text!,descPassed:txtDesc.text) 我的第二种方法是在类I中将类A分配给变量。然后我就可以用它来引用A类中的函数。 让allocVC = AllocationViewController() allocVC.sendAsMsg(txtTask.text!,descPassed:txtDesc.text) 第二种方法在设置中似乎更容易(没有协议,没有prepareForSegue代码)。但是,它会更频繁地引起故障,我不明白为什么。 例如,每当我使用第二种方法在A中运行一个具有解散B的代码的函数时,它似乎会引起麻烦。据我所知,只要我需要特定的操作顺序,除非我使用委托,否则我会遇到麻烦。 我不是要发布故障的解决方案。我真的需要有人解释他们为什么不同,并提供何时使用每个人的例子。

2 个答案:

答案 0 :(得分:4)

您似乎不了解类和实例(面向对象编程)。一个类可以有很多实例;这些实例不是彼此相同的对象。您不会向查看控制器发送消息,而是查看控制器实例。在您的方案中,一个视图控制器实例正在尝试将消息发送回另一个已存在的视图控制器实例

因此,这种方法永远不会起作用:

let allocVC = AllocationViewController()
allocVC.sendAsMsg(txtTask.text!, descPassed: txtDesc.text)

在此方法中,您将创建一个全新 AllocationViewController实例并向其发送消息。但这没有意义,因为 AllocationViewController实例不是现有的 AllocationViewController实例。是您要向其发送消息的现有 AllocationViewController实例。

这就是第一个方法 工作的原因。您正在将delegateToParentVC设置为实际的现有 AllocationViewController实例。

答案 1 :(得分:1)

我想在@matt的答案中增加一点。你是正确的,你可以通过获取一个类的实例来调用方法。正如我们在@matt的回答中所看到的那样,您正在创建一个类的新实例,这在这种情况下很少有用。更好的方法是通过访问全局sharedApplication来获取现有的类实例,然后从中查找类实例。

你会结束这样的事情:

let app = UIApplication.sharedApplication().delegate as! AppDelegate
let vc = app.window?.rootViewController as! AllocationViewController
vc.sendAsMsg(txtTask.text!, descPassed: txtDesc.text)

您的最终代码可能与我的有点不同,具体取决于应用程序层次结构中列出AllocationViewController的位置。