[英]Swift - Passing value back to ViewController using protocol and delegate
我是新手,我现在遇到的问题是,我想在单击“导航”按钮后将RoutePreviewController页面的值传回ViewController页面上显示。 如下图所示,您可以看到RoutePreviewController不是直接从ViewController中选择的。
但是,我尝试在代码中使用协议和委托。
这是我添加到ViewController(MainPage)的代码
protocol HandleSelectedPath{
func selectedPathDraw(selectedRoute:[(line:Int?,node:Int,time:Double)])
}
在ViewController的viewDidLoad中
let routePreviewPage = storyboard!.instantiateViewControllerWithIdentifier("RoutePreviewController") as! RoutePreviewController
routePreviewPage.handleSelectedPathDelegate = self
还有ViewController类之外的扩展
extension ViewController : HandleSelectedPath{
func selectedPathDraw(selectedRoute:[(line:Int?,node:Int,time:Double)]){
print("7687980")
selectedPath = selectedRoute
routeDraw()
}
}
在RoutePreviewController中,我有协议的委派。
var handleSelectedPathDelegate: HandleSelectedPath? = nil
和“导航”按钮动作
@IBAction func navigateButtonAction(sender: AnyObject) {
handleSelectedPathDelegate?.selectedPathDraw(previewPath)
dismissViewControllerAnimated(true, completion: nil)
definesPresentationContext = true
}
结果,单击“导航”按钮后,它确实将我发送回ViewController页面,但是未执行协议的selectedPathDraw函数。 我也尝试打印一些随机字符串,但是没有任何输出。
根据上面的代码,对RoutePreviewController
的引用仅存在于viewDidLoad
内部,您必须将其设置为property,如下所示:
var routePreviewPage: RoutePreviewController!
始终将您的delegate
作为弱引用来避免保留周期是一个好习惯,因此,实现您的委托和协议的正确方法应为以下代码:
protocol HandleSelectedPath: class {
func selectedPathDraw(selectedRoute:[(line:Int?,node:Int,time:Double)])
}
RoutePreviewController :
weak var handleSelectedPathDelegate: HandleSelectedPath?
@IBAction func navigateButtonAction(sender: AnyObject) {
handleSelectedPathDelegate?.selectedPathDraw(previewPath)
dismissViewControllerAnimated(true, completion: nil)
definesPresentationContext = true
}
ViewController的
viewDidLoad
:
routePreviewPage = storyboard!.instantiateViewControllerWithIdentifier("RoutePreviewController") as! RoutePreviewController
routePreviewPage.handleSelectedPathDelegate = self
希望对您有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.