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

时间:2014-09-10 07:46:09

标签: ios uiviewcontroller swift delegates

我正在尝试将数据从模式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方法。我做错了什么?

2 个答案:

答案 0 :(得分: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")
   }
}

您可以在Apple's Swift documentation中找到所需的所有信息。

答案 1 :(得分:6)

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

协议代码写在三个地方:

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

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

1. Main Protocol code

所以始终有:

  1. 协议代码(如上所示)
  2. 启动操作的VC中的代码
  3. 委托执行操作的VC中的代码
  4. <强> 1。协议代码

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

    <强> 2。启动操作的VC中的代码

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

    enter image description here

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

    enter image description here

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

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

    enter image description here

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

    enter image description here

    希望这有助于

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