Swift 2.2 协议和代理

一:代理 

    两个类之间的传值,类A调用类B的方法,类B在执行过程中遇到问题通知类A,这时候我们需要用到代理(Delegate)。

    比如:控制器(Controller)与控制器(Controller)之间的传值,从C1跳转到C2,再从C2返回到C1时需要通知C1更新UI或者是做其它的事情,这时候我们就用

到了代理(Delegate)传值。

二:协议

    上面说的两个界面,或者类之间的值传递,你就把协议当成他们之间的合同,就理解了。

    下面看看Swift代码怎么写协议,为了方便阅读,我这里把整个Swift文件代码插入了,不是只写了一个方法。这样我自己觉得阅读性更强一点!

import UIKit

// 协议的创建
protocol youname{    
    func younameis(name:NSString) -> Void
}
class ProfileViewController: UIViewController{
    
   // 声明一个协议类型的代理变量
    var delegate:youname!

    // 这个方法写在这里只是为了在后面的界面设置了代理之后,去调用这个方法。
    func delegatetest() -> Void {
        
        self.delegate.younameis("caoxiaocaoxiangni")
    }
   // 这里的思路其实和我们OC写的思路是一样的!
 
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor=UIColor.whiteColor()
    }
  
    override func didReceiveMemoryWarning() {
        
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    /*
    // MARK: - Navigation
    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */
}

     我们来看看第二个界面里面是怎么写的,上面一个是 ProfileViewController 控制器,push 到下一个控制器,MEViewController 中。

import UIKit

class MEViewController: UIViewController,youname {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Do any additional setup after loading the view.
        
        // 创建了变量,设置代理,遵守协议,调用方法。
        let you : ProfileViewController = ProfileViewController()
        you.delegate=self
        you.delegatetest()
        
    }
    // 上个控制器里面  delegatetest 这个方法中,我们又设置了让它的代理(其实就是MEViewController)调用 younameis 方法,前面界面的参数 caoxiaocao 也就传了过来!

    func younameis(name: NSString) {
     
           print(name) // caoxiaocao
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    /*
    // MARK: - Navigation
    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */
}

这样子,我也就完整的吧上个界面的值,传到了这个界面中来了。整个思路和OC的差不多。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xx_Cc的学习总结专栏

iOS-多线程详解

33090
来自专栏iOS技术杂谈

iOS网络——NSURLSession详解及SDWebImage源码解析你要知道的NSURLSession都在这里

你要知道的NSURLSession都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/1605429 本...

867100
来自专栏Rgc

requests模块报错:Use body.encode('utf-8') if you want to send it encoded in UTF-8.

在做 企业向微信用户个人付款  功能时,调用第三方sdk,在 进行 requests 的post请求时,

36410
来自专栏一“技”之长

iOS中CoreData数据管理系列二——CoreData框架中三个重要的类

    在上一篇博客中,介绍了iOS中使用CoreData框架设计数据模型的相关步骤。CoreData框架中通过相关的类将数据——数据模型——开发者无缝的衔接起...

14520
来自专栏BY的专栏

GCD调度组

31150
来自专栏王大锤

iOS多线程编程

38060
来自专栏每日一篇技术文章

weex-30-如何使用扫码功能

截止2017-5-8 号,weex框架没有提供扫描二维码的模块,所以就有了本节的内容

39710
来自专栏『不羁阁』 | 行走少年郎专栏

iOS多线程:『NSOperation、NSOperationQueue』详尽总结

20780
来自专栏王大锤

iOS多线程编程

13130
来自专栏Jed的技术阶梯

Kafka 中使用 Avro 序列化组件(三):Confluent Schema Registry

无论是使用传统的Avro API自定义序列化类和反序列化类还是使用Twitter的Bijection类库实现Avro的序列化与反序列化,这两种方法都有一个缺点:...

2.7K10

扫码关注云+社区

领取腾讯云代金券