iOS 开发每天分享优质文章

Swift中闭包传值和代理传值

2016-11-17  本文已影响185人  疯狂的小码农

一、导语:

Untitled.gif

二、要了解什么是闭包?如何定义闭包?

三、Swift中闭包传值:

    //1.声明闭包(定义闭包类型):关键字typealias类似于OC中typedef 
    typealias sendValueClosure = (_ string:String, _ textColor:UIColor) -> Void 
  
    //2.声明一个闭包变量: 
    var myClosure : sendValueClosure! 

    //3.创建闭包方法(传值):
     func buttonClick()->Void{//此方法为点击B界面中的Button返回到A界面
        if myClosure != nil { 
             myClosure("你好!FirstVC_闭包传值!",UIColor(red:CGFloat(CGFloat(arc4random())/CGFloat(RAND_MAX)),green:CGFloat(CGFloat(arc4random())/CGFloat(RAND_MAX)), blue:CGFloat(CGFloat(arc4random())/CGFloat(RAND_MAX)), alpha:1)) 
        } 
       _ = self.navigationController?.popViewController(animated: true) 
    }

也可以这样写:

    //1.声明闭包(定义闭包类型):关键字typealias类似于OC中  
    typedef typealias sendValueClosure = (_ string:String, _ textColor:UIColor) -> Void
 
    //2.声明一个闭包变量: 
    var myClosure : sendValueClosure!
    //3.创建闭包方法(传值):
    func buttonClick()->Void{//此方法为点击B界面中的Button返回到A界面 
        if myClosure != nil { 
           myClosure("你好!FirstVC_闭包传值!", UIColor(red:CGFloat(CGFloat(arc4random())/CGFloat(RAND_MAX)), green:CGFloat(CGFloat(arc4random())/CGFloat(RAND_MAX)), blue:CGFloat(CGFloat(arc4random())/CGFloat(RAND_MAX)), alpha:1)) 
        }
     _ = self.navigationController?.popViewController(animated: true) } 
    func initClosure(closure:sendValueClosure?) -> Void {     
       myClosure = closure 
    }
    func buttonClick() -> Void {//此方法是推进B界面并 let         
      secondVC = SecondViewController()//初始化B界面        
      secondVC.myClosure = {//B界面的闭包变量赋值        
      (string:String,color:UIColor) -> Void in self.view.backgroundColor = color self.title = string 
    }
    self.navigationController?.pushViewController(secondVC, animated: true) 
    }

代码也可以这样写:

   func buttonClick() -> Void {//此方法是推进B界面并 let     
        secondVC = SecondViewController()//初始化B界面      
        secondVC.initClosure(closure:     
        someFunctionThatTakesAClosure)    
       self.navigationController?.pushViewController(secondVC, animated: true)
   }
   func someFunctionThatTakesAClosure(string:String,textColor:UIColor) -> Void {
       self.view.backgroundColor = textColor self.title = string 
   }

四、代理传值:

  //1.制定协议和方法并遵守NSObjectProtocol protocol    
  ThirdViewControllerDelegate:NSObjectProtocol { 
     func passValueToSecondVC(_ string:String, color:UIColor)
   }
 //2.点击此处返回B界面 
 @IBAction func popToSecondVC(_ sender: Any) {
       if delegate != nil{ 
            delegate.passValueToSecondVC("你好!SecondVC_代理传值!", color: UIColor(red:CGFloat(CGFloat(arc4random())/CGFloat(RAND_MAX)), green:CGFloat(CGFloat(arc4random())/CGFloat(RAND_MAX)), blue:CGFloat(CGFloat(arc4random())/CGFloat(RAND_MAX)), alpha:1)) 
   }
       _ = self.navigationController?.popViewController(animated: true)
   }
 //1.遵守协议ThirdViewControllerDelegate class SecondViewController:   UIViewController,ThirdViewControllerDelegate 
 //2.设置代理 
func button_0Click() -> Void { 
     let thirdVC = ThirdViewController() 
     thirdVC.delegate = self   
     self.navigationController?.pushViewController(thirdVC, animated: true) 
 }
 //3.执行代理方法 
 func passValueToSecondVC(_ string: String, color: UIColor) {    
    self.title = string 
    self.view.backgroundColor = color 
 }
上一篇 下一篇

猜你喜欢

热点阅读