swift中代理的使用

下面以自定义的UITableViewCell的代理为例,记录一下swift中代理的使用

controller中的代码如

 1 //
 2 //  ViewController.swift
 3 //  simpleDemo
 4 //
 5 //  Created by liubo on 16/7/25.
 6 //  Copyright © 2016年 liubo. All rights reserved.
 7 //
 8
 9 import UIKit
10
11 class ViewController: UIViewController,
12         UITableViewDataSource,
13         UITableViewDelegate,
14         DelegateCellDelegate{
15
16     var tableView: UITableView?
17
18     //MARK: -- lifeCycle
19     override func viewDidLoad() {
20         super.viewDidLoad()
21
22         self.navigationController?.navigationBar.barTintColor = UIColor.cyanColor()
23         self.view.backgroundColor = UIColor.whiteColor()
24
25         initTableView()
26     }
27
28     //MARK: -- UITableViewDataSource
29     func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
30         return 10
31     }
32
33     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
34         let cell = tableView.dequeueReusableCellWithIdentifier(NSStringFromClass(DelegateCell), forIndexPath: indexPath) as? DelegateCell
35         cell!.textLabel?.text = "\(indexPath.row)"
36         cell!.delegate = self
37         return cell!
38     }
39
40     //MARK: -- DelegateCellDelegate
41     func giveLike(btn: UIButton) {
42         print(123)
43     }
44
45     //MARK: -- private
46     func initTableView() {
47         let tableView = UITableView(frame: CGRectMake(0,0,self.view.width,self.view.height))
48         tableView.backgroundColor = UIColor.whiteColor()
49         tableView.dataSource = self
50         tableView.delegate = self
51         tableView .registerClass(DelegateCell.classForCoder(), forCellReuseIdentifier: NSStringFromClass(DelegateCell))
52         self.tableView = tableView
53         self.view.addSubview(self.tableView!)
54     }
55 }

controller.swift

Cell中的代码

 1 //
 2 //  DelegateCell.swift
 3 //  simpleDemo
 4 //
 5 //  Created by liubo on 16/7/26.
 6 //  Copyright © 2016年 liubo. All rights reserved.
 7 //
 8
 9 import UIKit
10
11 protocol DelegateCellDelegate :NSObjectProtocol {
12
13     func giveLike(btn:UIButton)
14 }
15
16 class DelegateCell: UITableViewCell {
17     var likeButton: UIButton?
18     weak var  delegate: DelegateCellDelegate?
19
20     override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
21         super.init(style: .Default, reuseIdentifier: reuseIdentifier)
22         initSubViews()
23     }
24
25     func initSubViews() {
26         let like = UIButton(type: .Custom)
27         like.frame = CGRectMake(UIScreen.mainScreen().bounds.size.width - 40, 10, 30, 30)
28         like.backgroundColor = UIColor.orangeColor()
29         like.setTitle("赞", forState: .Normal)
30         like.addTarget(self, action: Selector("lickClicked:"), forControlEvents: .TouchUpInside)
31         likeButton = like
32         self.addSubview(likeButton!)
33     }
34
35     func lickClicked(sender: UIButton) {
36        delegate?.giveLike(sender)
37
38     }
39
40     required init?(coder aDecoder: NSCoder) {
41         fatalError("init(coder) has not been implemented")
42     }
43
44 }

自定义Cell中的代码

在代码中用到了UIView的extension,值得一提的是在swift中可以直接对一个对象的结构体属性的成员进行直接赋值,这一点在OC中是做不到的

如要给一个view设置y值,在swift中可以这样写

public var x: CGFloat {

get {

return self.frame.origin.x

}

set {

self.frame.origin.x = newValue

}

}

而在OC中则要这样写

- (void) setTop: (CGFloat) newtop {

CGRect newframe = self.frame;

newframe.origin.y = newtop;

self.frame = newframe;

}

extension的代码如下

  1 //
  2 //  UIViewExtension.swift
  3 //  joke
  4 //
  5 //  Created by liubo on 16/7/26.
  6 //  Copyright © 2016年 liubo. All rights reserved.
  7 //
  8
  9 import Foundation
 10 import UIKit
 11
 12 extension UIView {
 13     //x--left
 14     public var x: CGFloat {
 15         get {
 16             return self.frame.origin.x
 17         }
 18         set {
 19             self.frame.origin.x = newValue
 20         }
 21     }
 22     //y--top
 23     public var y: CGFloat {
 24         get {
 25             return self.frame.origin.y
 26         }
 27         set {
 28             self.frame.origin.y = newValue
 29         }
 30     }
 31     //width
 32     public var width: CGFloat {
 33         get {
 34             return self.frame.size.width
 35         }
 36         set {
 37             self.frame.size.width = newValue
 38         }
 39     }
 40     //height
 41     public var height: CGFloat {
 42         get {
 43             return self.frame.size.height
 44         }
 45         set {
 46             self.frame.size.height = newValue
 47         }
 48     }
 49     //right
 50     public var right: CGFloat {
 51         get {
 52             return self.frame.origin.x + self.frame.size.width
 53         }
 54         set {
 55             self.frame.origin.x = newValue - self.frame.size.width
 56         }
 57     }
 58     //bottom
 59     public var bottom: CGFloat {
 60         get {
 61             return self.frame.origin.y + self.frame.size.height
 62         }
 63         set {
 64             self.frame.origin.y = newValue - self.frame.size.height
 65         }
 66     }
 67
 68     //中心x
 69     public var centerX :CGFloat {
 70         get {
 71             return self.center.x
 72         }
 73         set {
 74             self.center.x = newValue
 75         }
 76     }
 77
 78     //中心y
 79     public var centerY :CGFloat {
 80         get {
 81             return self.center.y
 82         }
 83         set {
 84             self.center.y = newValue
 85         }
 86     }
 87
 88     public var orign: CGPoint {
 89         get {
 90             return self.frame.origin
 91         }
 92         set {
 93             self.frame.origin = newValue
 94         }
 95     }
 96
 97     public var size: CGSize {
 98         get {
 99             return self.frame.size
100         }
101         set {
102             self.frame.size = newValue
103         }
104     }
105 }

Extension.swift

在打出protocol DelegateCellDelegate  {

func giveLike(btn:UIButton)

}后,发现不能用weak了修饰,代理我们都知道 arc中需要使用weak来避免循环引用造成内存泄漏,此时要在后面加上 :NSObjectProtocol,这样就能用weak来修饰

地址:http://pan.baidu.com/s/1dFbnCMP

时间: 2024-08-24 08:19:29

swift中代理的使用的相关文章

初识Swift中的值和引用,循坏引用、代理的注意点

1.0 在Swift中分有值类型和引用类型 Int .String . 结构体和枚举都属于值类型, 将值类型传递给方法是,将在内存中创建其副本,并传递这个副本:这样我们就可以随心所欲修改它,而不用担心这会修改传入的原始值. 传递引用类型时不会复制它,而将其地址提供给可能使用他们的函数或方法.闭包以及从类实例化得到的对象都属于引用类型.将闭包或者对象传递给方法时,不会创建其副本,而是传递引用(内存地址).由于传递引用类型时不会创建其副本,因此需要特别小心,确保在正确的时间妥善地释放它们,过早的释放

Swift中的UIKit重力学

前言: 重力学这个名词不论在哪个行业领域听起来似乎都非常高大上. 那么在Swift中的重力学是什么呢?那就是将我们移动端屏幕上毫无生命力的东西也置于万有引力中.使它们能够展现出好像真的因为引力而向下坠落以及碰到物体后自然的弹开的效果. 要想做到这一点,我们得须要两个利器:UIKit Dynamics和Motion Effects. 一.简介 1.UIKit Dynamics是从iOS 7開始引入的一种新技术,隶属于UIKit框架的物理引擎.能模拟和仿真现实生活中的物理现象它能够让我们在程序中对界

Swift中KVO(监听)的使用方法及注意事项

---恢复内容开始--- 相信研究swift语言的开发者都多多少少了解或者精通Objective—C语言,熟练掌握Objective—C语言的开发者,在学习swift语言的过程中,是比较快速,而又轻松的.本人就是一位熟练掌握OC语言,后开始研究的swift.在学习swift语言的过程中,笔者建议有OC基础的开发者,在写swift的代码过程中,再写一下OC中的代码,二者相互比较,相信你能找到快速学会swift语言的方法.资深,有耐心和有天赋的开发者,相信能在一周左右,能够运用swift开发项目.其

swift中的传值

光阴似箭,日月如梭,转眼间学习的旅途已经过了一大半了,忘着自己所敲过的成批的代码,看着自己付出和努力,默默地为自己这几个月的奋斗感到欣慰,不论学习的路途再怎么的艰辛,但是自己还是坚持过来了,回想着以往的自己,似乎还从没有这么的坚持过,也没有这么的认真对待过,所以这么艰难的路自己都走过来了,后面的我相信一定是绚丽的明天和辉煌的未来,也许有些人说当个程序员真的好苦,但是我并不这么认为,因为这是我想做的,也是我所向往的,更是我所选择的道路,做“你”所想,实现我们共同的目标!!!! 在这看似漫长而又短暂

swift中collectionView的简单用法

之前写过OC中collectionView的用法,现在再看看swift中collectionView的用法,有兴趣的朋友,可以两者前后比较下区别,swift现在没有稳定下来,语法更新的比较快,但是它核心的一些东西,已经定型了.这些还是靠读者们自己去挖掘吧. //这里签署数据源和代理,此时不需要引入layout的代理,也可以.class AmonViewController: UIViewController ,UICollectionViewDataSource,UICollectionView

Swift 委托/代理设计模式

Swift 中的委托/代理模式(以下简称"代理模式")与object-c的代理模式基本一致. 代理模式的基本思想就是将我(类或者结构体等)需要来完成的工作交给(委托给)另一个有我所规定的做这项工作能力的人(符合要求类型的对象等)来处理. 代理模式的实现需借助于我们上一篇文章所讲的协议.我们定义一个协议来封装那些指定的方法(做这项工作的能力),使实现这些协议的类等拥有这些方法,我们就可以将工作委托给他来处理. 举个实际例子,比如我要去租房,首先我是有租房的能力,但是我没有时间或者其他原因

Swift 中的Range和NSRange不同

Swift中的Ranges和Objective-C中的NSRange有很大的不同,我发现在处理Swift中Ranges相关的问题的时候,总是要花费比我想象的更多的时间.不过,现在回过头来看看,发现Swift中的Ranges的使用还是比较合理的,但是想要正确的使用Ranges真的需要一些特别的技巧. 看一个例子,下面这段代码展示的是截取以指定的字符开头和以指定的字符结尾的子字符串: ? 1 2 3 4 5 6 var str = "Hello, playground"   let ran

Swift 中的基础语法(二)

1.Swift 中的函数 /// 函数的定义 /// /// - Parameters: /// - x: 形参 /// - y: 形参 /// - Returns: 返回值 func sum(x: Int, y: Int) -> Int { return x + y } print(sum(x: 10, y: 20))   /* 外部参数就是在形参前面加了一个字 外部参数不会影响函数内部的细节 外部参数会让外部调用看起来更加直观 外部参数如果使用了'_',在外部调用函数时,会忽略形参的名字 &qu

Swift中的错误处理

前言 任何代码都会发生错误,这些错误有些是可以补救的,有些则只能让程序崩溃.良好的错误处理能够让你的代码健壮性提高,提高程序的稳定性. 本文的Swift版本:Swift 3 Objective C 返回nil 如果出错了,就返回空是Objective C中的一种常见的处理方式.因为在Objective C中,向nil发送消息是安全的.比如: - (instancetype)init { self = [super init]; if (self) { } //如果初始化失败,会返回nil ret