繁体   English   中英

Swift-使用协议和委托将值传递回ViewController

[英]Swift - Passing value back to ViewController using protocol and delegate

我是新手,我现在遇到的问题是,我想在单击“导航”按钮后将RoutePreviewController页面的值传回ViewController页面上显示。 如下图所示,您可以看到RoutePreviewController不是直接从ViewController中选择的。

这是我在xcode上进行swift项目的故事板

但是,我尝试在代码中使用协议和委托。

这是我添加到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM