Swift中如何在dismiss模态视图控制器时传递数据

12

我正在尝试从模态视图控制器传递数据到他的源视图控制器。 我认为我必须使用委托,但它不起作用。

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个回答

25

您在调用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")
   }
}

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


我能否使用闭包来实现在两个控制器之间传递数据,就像你的例子一样。@Gad - lighter
当然可以使用协议来实现这个解决方案:func backFromCamera(string : String)... - Josep Escobar

6
显然,所选择的答案是正确的,但它对我没有帮助。不过,我成功地实现了协议,因此我想提供自己的解释,以防有人像我一样难以理解概念。 协议代码写在三个地方:
  • 两个 ViewController 类
  • 协议本身(代码写在 VC 类之外)
当我编写协议时,我将它们放在我的“工具箱”文档中,并且仍然写注释以提醒自己哪些 VC 在执行什么操作。以下是两个示例:

1. Main Protocol code

因此总是存在以下内容:

  1. 协议代码(如上所示)
  2. 引发操作的 VC 中的代码
  3. 被委托执行操作的 VC 中的代码

1. 协议代码

请参照上图。实际上,协议代码只是你为协议命名并声明你想要远程调用或委托执行的函数的地方。 给协议命名。声明可以调用的函数的名称及其参数类型,例如字符串等。

2. 引发操作的 VC 中的代码

这是引发协议的代码。在这个例子中,这是一个来自表格单元格的代码,它需要将一些工作委托回到主表格 VC。第一个屏幕截图显示了委托变量的创建,而第二个屏幕截图则是该变量的实际使用。

enter image description here

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

enter image description here

3. 在被委托执行操作的VC中编写代码

现在协议正在被调用,但是哪个VC回答了这个调用呢?为了回答这个问题,选择VC并将协议名称添加到类声明中:

enter image description here

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

enter image description here

希望能够帮助

我不知道为什么协议就是无法进入我的脑海,但它们确实无法。我希望这能帮助像我一样的其他人!


8
如何复制您的代码?截图不适合此操作。 - Kalzem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接