Swift纯代码页面传值

作者: Sheepy | 来源:发表于2015-09-26 01:23 被阅读3578次
Update: 之前的代码会造成循环引用,导致两个类都不能被正确回收,应做如下修改:
protocol BaseCtrlDelegate: class {
    func dismissPushedCtrl(controller: UIViewController)
}
//相同内容
class PushedCtrl: UIViewController {
    //相同内容

    weak var delegate: BaseCtrlDelegate!
}

页面跳转啊页面间传值啊,这是每个项目几乎都要用到的东西。近年来苹果一直都在推Storyboard,页面跳转可以直接在Storyboard上拉线,然后用segue或者unwind来做一些传值的操作,非常方便,这里就不细说了。

然而在实际开发中,由于各种原因或者因为个人喜好我们可能会用纯代码开发,当然也包括页面跳转跟页面传值。今天我就遇到了这种情况,由于之前一直是用segue跟unwind的,所以稍微折腾了一下才搞定,顺便也记录一下,希望能帮到有需要的人。

跳转方式就以最平常的Push为例,跳转的时候传值只需要在当前Controller中直接对将要跳转的Controller的一个实例对象进行操作即可(见代码注释),而在返回上个页面的时候进行传值就需要用到委托了,关于委托我之前有篇博文详细说过,今天就直接上代码了。

protocol BaseCtrlDelegate {
    func dismissPushedCtrl(controller: UIViewController)
}

class BaseCtrl: UIViewController, BaseCtrlDelegate {
    var baseMsg: String! {
        didSet {
            print("BaseCtrl:" + baseMsg)
        }
    }
    //获取即将出栈的ViewController的实例,相当于获取它内部的数据(如msg)
    func dismissPushedCtrl(controller: UIViewController) {
        if let pushedCtrl = controller as? PushedCtrl{
            //传值
            baseMsg = pushCtrl.backMsg
            loginCtrl.navigationController?.popViewControllerAnimated(true)
        }
    }
   
    //......

    //跳转按钮点击事件
    func push() {
        baseMsg = "I'm coming!"
        let pushedCtrl = PushedCtrl()
        //传值
        pushedCtrl.backMsg = baseMsg
        pushedCtrl.delegate = self
        self.navigationController?.pushViewController(pushedCtrl, animated: true)
    }
}

class PushedCtrl: UIViewController {
     //......
    var backMsg: String! {
        didSet {
            print("PushedCtrl:" + backMsg)
        }
    }
    var delegate: BaseCtrlDelegate!
    //返回按钮点击事件
    func back() {
        backMsg = "I'm back!"
        delegate.dismissPushedCtrl(self)
    }
}

这就是整个过程,在跳转和返回时都进行了传值操作。代码是直接在页面上写的,没调试过,大家可以补充完整然后跑一下看看。今天就先这样。

相关文章

  • Swift纯代码页面传值

    Update: 之前的代码会造成循环引用,导致两个类都不能被正确回收,应做如下修改: 页面跳转啊页面间传值啊,这是...

  • 11.4页面传值

    //一、AppDelegate.swift // //AppDelegate.swift //页面传值 // //...

  • OC与swift的数据传输

    简介 该项目主要介绍了oc与swift之间、swift内部几种常见的传值方式(属性传值、代码块传值、代理传值、通知...

  • Flutter_嵌套APP

    flutter 代码块 swift 传值 原生 to flutter 传值 flutte to 原生 写在后面...

  • layui 向iframe弹窗传值 子父页相互传值

    子页调用父页面 父页面代码 子页面代码 父页面向子页面传值 父页面代码 iframe子页面代码 也可以在父页面通过...

  • iOS页面传值问题(swift2.0篇)

    iOS页面传值问题(swift2.0篇) 同样是介绍iOS开发中的页面传值,此篇与上一篇使用Objective-C...

  • 资料查询经典合集

    Swift - 纯代码实现页面segue跳转,以及参数传递http://www.hangge.com/blog/c...

  • Swift 多种页面传值

    Swift 日渐成熟,如今已经发展到3.0 版本。本文介绍iOS开发中常用的技能---页面传值。(PS:熟知OC更...

  • Swift:基础(十六)闭包

    Swift 闭包 闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值。 Swift...

  • iOS swift 学习(二)

    Swift 闭包闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值。Swift 中...

网友评论

  • xiongyi:大神,有没有demo给下载来看一看啊
    Sheepy:@xiongyi 没有:joy: 这个很简单的 其实只要第二个 controller 持有第一个 controller 的 weak 引用 然后在第二个 controller 要消失前对第一个 controller 操作就行 譬如直接对第一个 controller 的某个属性赋值 像我文中这样用协议的话只是更通用一点

本文标题:Swift纯代码页面传值

本文链接:https://www.haomeiwen.com/subject/xekwcttx.html