【问题标题】:Pass data when dismiss modal viewController in swift快速关闭模态视图控制器时传递数据
【发布时间】:2014-09-10 07:46:09
【问题描述】:

我正在尝试将数据从 modal ViewController 传递到他的 source ViewController。我想我必须使用delegation,但它不起作用。

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 方法。我做错了什么?

【问题讨论】:

    标签: ios uiviewcontroller swift delegates


    【解决方案1】:

    您没有设置委托,因此当您尝试调用 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 中找到您需要的所有信息。

    【讨论】:

    • 我可以使用闭包在两个控制器上实现传递数据,就像你的例子一样。 @Gad
    • 是的!当然你可以使用协议来实现这个解决方案:func backFromCamera(string : String)...
    【解决方案2】:

    显然选择的答案是正确的,但它对我没有帮助。不过我确实成功实现了协议,所以我想提供我自己的解释,以防有人像我一样难以理解这个概念。

    协议代码写在三个地方:

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

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

    所以总会有:

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

    1.协议代码

    请参阅上图作为参考。本质上,协议代码就是你给协议一个名字并声明你想要远程调用/委托的函数的地方。命名协议。声明可以调用的函数的名称,并声明其参数类型,如字符串等。

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

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

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

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

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

    最后,你需要整件事的真正内容。不是触发器,不是协议本身,不是类声明……而是您要调用的实际函数:

    希望对您有所帮助

    我不知道为什么协议不会穿透我厚厚的头骨,但它们不会。我希望这可以帮助像我这样的其他人!

    【讨论】:

    • 如何复制您的代码?屏幕截图不适用于此
    猜你喜欢
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    相关资源
    最近更新 更多