我正在尝试将数据从模式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方法。我做错了什么?
答案 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)
显然,所选择的答案是正确的,但它对我没有帮助。我确实成功地实现了协议,所以我想提供我自己的解释,以防任何人在努力抓住这个概念,就像我一样。
协议代码写在三个地方:
当我编写协议时,我将它们放在我的“ToolBox”文档中,我仍然写评论以提醒自己哪些VC正在做什么。两个例子:
所以始终有:
<强> 1。协议代码
请参阅上图以获取参考。从本质上讲,协议代码就是为协议命名并声明要远程调用/委托的函数的地方。命名协议。声明可以调用的函数的名称并声明它们的参数类型,例如string等。
<强> 2。启动操作的VC中的代码
这是启动协议的代码。在此示例中,这是来自表格单元格的代码,表格单元格需要将某些工作委托给主表格VC。第一个屏幕截图显示了委托变量的创建,第二个屏幕截图是该变量的实际使用。
所以下面的代码是表格单元格按钮。它们都需要触发单元VC之外的代码,因此它们都使用上面声明的协议触发函数。
第3。 VC中的代码,用于执行操作
现在正在调用协议,但哪个VC接听电话?要回答该问题,请选择VC并将协议名称添加到类声明中:
最后,你需要整个事物的实际肉。不是触发器,不是协议本身,不是类声明......而是要调用的实际函数:
希望这有助于
我不知道为什么协议不会沉入我厚厚的头骨,但他们不会。我希望这能帮助像我这样的人!