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

Mar*_*rco 12 delegates uiviewcontroller ios swift

我正在尝试将模式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")
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Gad*_*Gad 24

您没有设置委托,因此当您尝试呼叫时它是空的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")
   }
}
Run Code Online (Sandbox Code Playgroud)

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


Dav*_*e G 6

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

协议代码写在三个地方:

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

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

1.主协议代码

总是:

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

1.协议代码

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

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

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

在此输入图像描述

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

在此输入图像描述

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

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

在此输入图像描述

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

在此输入图像描述

希望这可以帮助

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

  • 如何复制代码?屏幕截图不适用于此 (7认同)