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