2016-01-14 97 views
0

如果我在A类中,并且想在B类中运行一个函数,我可以用几种方法来完成。在我的应用程序中,我使用两种不同的方式,他们的行为不同,但我不知道为什么。代表与类参考

第一个是通过授权。我建立一个协议,设定在prepareForSegue委托,然后用它来从B类回叫A类:

var delegateToParentVC: mainViewDelegate! 
delegateToParentVC.sendAsMsg(txtTask.text!, descPassed: txtDesc.text) 

我的第二个方法是,在I类A类分配给一个变量。然后我能够使用它来引用类A

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

第二种方法似乎更容易在设置(没有协议,没有prepareForSegue代码)功能。但是,它会导致更多的故障,我不明白为什么。

例如,无论何时我使用第二种方法运行A中具有解除B的代码的功能,似乎会造成麻烦。从我所知道的情况来看,任何时候我需要一个特定的操作顺序,除非我使用授权,否则我会遇到麻烦。

我不是张贴问题的解决方案。我真的需要有人解释为什么他们不同,并举例说明何时使用它们。

+1

你对“毛刺”有点含糊。由于存在大量可能的故障,并且您正在尝试学习,因此指定所述故障以便向他们解释是个好主意。这将帮助你巩固你从这里提供的答案中学到的东西。 –

+0

@JoshuaNozzi嗨约书亚,我真的很喜欢尝试解决我自己的问题后来更好地了解差异。代表团似乎对我来说是极其不必要的,除非它是为了类型安全的原因。为什么要打扰更多的设置代码?所以我只是试图理解它们在执行/运行方式上的差异,以及什么时候使用它们的最佳例子。 –

回答

4

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

因此,这种方法是永远不会在所有的工作:

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

在这种方法中,你正在创建一个全新 AllocationViewController实例并发送消息。但这是毫无意义的,因为这个 AllocationViewController实例不是现有的 AllocationViewController实例。它是现有的您想要发送消息的AllocationViewController实例。

这就是为什么第一方法确实工作。您正在将delegateToParentVC设置为实际,现有的 AllocationViewController实例。

1

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

你会用这样的风:不同的地方AllocationViewController在你的应用层次列出

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

您的最终代码可能会比我有点不同。