在swift中解除模态viewController时传递数据

我正在尝试将模式ViewController中的数据传递给他的源ViewController 。 我想我必须使用委托,但它不起作用。

protocol communicationControllerCamera{ func backFromCamera() } class Camera: UIViewController{ var delegate: communicationControllerCamera init(){ self.delegate.backFromCamera() } } class SceneBuilder: UIViewController, communicationControllerCamera{ func backFromCamera(){ // Never called println("YEAHH") } } 

它没有被调用的backFromCamera方法。 我做错了什么?

您没有设置委托,因此当您尝试调用backFromCamera()时它是空的。

这是一个可以测试的简单工作示例。 注意委托使用可选类型(?)。

 // Camera class protocol communicationControllerCamera { func backFromCamera() } class Camera: UIViewController { var delegate: communicationControllerCamera? = nil override func viewDidLoad() { super.viewDidLoad() self.delegate?.backFromCamera() } } // SceneBuilder class class SceneBuilder: UIViewController, communicationControllerCamera { override func viewDidLoad() { super.viewDidLoad() } override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) var myCamera = Camera() myCamera.delegate = self self.presentModalViewController(myCamera, animated: true) } func backFromCamera() { println("Back from camera") } } 

您可以在Apple的Swift文档中找到所需的所有信息。

显然,所选择的答案是正确的,但它对我没有帮助。 我确实成功地实现了协议,所以我想提供我自己的解释,以防任何人正在努力抓住这个概念,就像我一样。

协议代码写在三个地方:

  • 两个ViewController类
  • 协议本身(在VC类之外编写的代码)

当我编写协议时,我将它们放在我的“ToolBox”文档中,我仍然写评论以提醒自己哪些VC正在做什么。 两个例子:

1.主协议代码

总是:

  1. 协议代码(如上所示)
  2. VC中的代码,用于启动操作
  3. VC中的代码,用于执行操作

1.协议代码

请参阅上图以获取参考。 从本质上讲,协议代码就是为协议命名并声明要远程调用/委托的函数的地方。 命名协议。 声明可以调用的函数的名称,并声明它们的参数类型,如字符串等。

2.启动操作的VC中的代码

这是启动协议的代码。 在此示例中,这是来自表格单元格的代码,表格单元格需要将某些工作委托给主表格VC。 第一个屏幕截图显示了委托变量的创建,第二个屏幕截图是该变量的实际使用。

在此处输入图像描述

所以下面的代码是表格单元格按钮。 它们都需要触发单元VC之外的代码,因此它们都使用上面声明的协议触发函数。

在此处输入图像描述

3. VC中的代码,用于执行操作

现在正在调用协议,但哪个VC接听电话? 要回答该问题,请选择VC并将协议名称添加到类声明中:

在此处输入图像描述

最后,你需要整个事物的实际肉。 不是触发器,不是协议本身,不是类声明……而是要调用的实际函数:

在此处输入图像描述

希望这可以帮助

我不知道为什么协议不会沉入我厚厚的头骨,但他们不会。 我希望这有助于像我这样的人!