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)
        }
    

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

    运行效果是这样的

  • 相关阅读:
    HDU 1501 Zipper(DFS)
    HDU 2181 哈密顿绕行世界问题(DFS)
    HDU 1254 推箱子(BFS)
    HDU 1045 Fire Net (DFS)
    HDU 2212 DFS
    HDU 1241Oil Deposits (DFS)
    HDU 1312 Red and Black (DFS)
    HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)
    HDU 1022 Train Problem I(栈)
    HDU 1008 u Calculate e
  • 原文地址:https://www.cnblogs.com/ybw123321/p/5367151.html
Copyright © 2011-2022 走看看