zoukankan      html  css  js  c++  java
  • [Swift]iOS开发之不同界面传值

    iOS开发中不可避免要用到不同界面传值,今天就总结下三种传值方法:闭包传值、代理传值和通知传值。

    1、闭包传值

    如图建立VC1和VC2,com+R运行正常~把VC2的button用Action关联并设置tag。

    在VC2中定义一个闭包

    var closures: ((clicked: NSString) -> Void)?
    

     设置VC2中三个button的点击事件(这里三个button的tag设置为101,102,103)

    @IBAction func numBtn(sender: AnyObject) {
            switch sender.tag {
            case 101:
                self.closures!(clicked: "1")
            case 102:
                self.closures!(clicked: "2")
            case 103:
                self.closures!(clicked: "3")
            default:
                return
            }
        }
    

     这样点击按钮就实现了给闭包传值,下一步就是把值传到VC1~在VC1添加这个⬇️控制器切换的时候被调用

     override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        }
    

     在里面添加⬇️,至于闭包的写法,我也是照抄的。。。。。。多写几遍就知道了

    //设置vc2为VC2,创建控制器类对象
            let vc2 = segue.destinationViewController as! VC2
            vc2.closures = {(clicked: NSString) -> Void in
                print(clicked)
                self.txtLabel.text = "(clicked)"
            }
    

     运行结果控制台打印出点击数字结果显示闭包传值,成功!

    2、代理传值

    代理这个东西,我们很熟悉,比如常用的UITableViewDelegate,系统会提供很多func需要我们实现,这里的代理传值也是一样的,只是这个代理是我们自己定义的。

    在VC2中定义一个代理(import UIKit下面直接写就可以),里面定义一个需要实现的func~

    protocol clickedDelegate {
        func clicked(num: String)
    }
    

     定义一个变量方便调用

    var _delegate:clickedDelegate?
    

     然后还是那套,我懒嘛~

    @IBAction func numBtn(sender: AnyObject) {
            switch sender.tag {
            case 101:
                _delegate?.clicked("1")
            case 102:
                _delegate?.clicked("2")
            case 103:
                _delegate?.clicked("3")
            default:
                return
            }
        }
    

     回到VC1,在class那块添加代理(有没有很强的既视感!!!完全跟用UITableViewDelegate之类的一样一样的嘛!)

    接下来就是实现这个代理~

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
            var vc2 = segue.destinationViewController as! VC2
            vc2._delegate = self
        }
        
    func clicked(num: String) {
            print(num)
            self.txtLabel.text = num
        }
    

     运行结果就不截图了,就那样。

    3、通知传值

    关于NSNotificationCenter,quickhelp是这么介绍的:An NSNotificationCenter object (or simply, notification center) provides a mechanism for broadcasting information within a program. An NSNotificationCenter object is essentially a notification dispatch table.

     先在VC2中设置一个发送通知的func

    func sendNotification() -> Void {
        NSNotificationCenter.defaultCenter().postNotificationName("clicked", object: num)
        }
    

     设置button点击事件

     @IBAction func numBtn(sender: AnyObject) {
            switch sender.tag {
            case 101:
                num = 1
                self.sendNotification()
            case 102:
                num = 2
                self.sendNotification()
            case 103:
                num = 3
                self.sendNotification()
            default:
                return
            }
        }
    

     再在VC1中设置一个接受通知的func,是不是感觉像电台

    func getNotificationFromVC2(object: AnyObject) -> Void {
            print(object)
            self.txtLabel.text = "(object.object)"
            
        }
    

     然后在viewDidLoad里面实现监听

    override func viewDidLoad() {
            super.viewDidLoad()
    
            // Do any additional setup after loading the view.
            NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(VC1.getNotificationFromVC2(_:)), name: "clicked", object: nil)
        }
    

     这里监听到的结果是这么个东西

    运行效果是这样的

  • 相关阅读:
    SQL统计
    数据库中GETDATE()函数格式化时间
    C#中Math类的计算整数的三种方法
    Excel 导入到Datatable 中,再使用常规方法写入数据库
    C#实现二维码功能,winform 以及 asp.net均可以用
    JPEG、PNG、GIF三者的区别与联系
    javaScript基础知识--变量提升和闭包
    js基础
    js基础知识
    js基础知识
  • 原文地址:https://www.cnblogs.com/ybw123321/p/5367151.html
Copyright © 2011-2022 走看看