首页 > 代码库 > swift中代理的使用
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 UIKit10 11 class ViewController: UIViewController,12 UITableViewDataSource,13 UITableViewDelegate,14 DelegateCellDelegate{15 16 var tableView: UITableView?17 18 //MARK: -- lifeCycle19 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: -- UITableViewDataSource29 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {30 return 1031 }32 33 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {34 let cell = tableView.dequeueReusableCellWithIdentifier(NSStringFromClass(DelegateCell), forIndexPath: indexPath) as? DelegateCell35 cell!.textLabel?.text = "\(indexPath.row)"36 cell!.delegate = self37 return cell!38 }39 40 //MARK: -- DelegateCellDelegate41 func giveLike(btn: UIButton) {42 print(123)43 }44 45 //MARK: -- private46 func initTableView() {47 let tableView = UITableView(frame: CGRectMake(0,0,self.view.width,self.view.height))48 tableView.backgroundColor = UIColor.whiteColor()49 tableView.dataSource = self50 tableView.delegate = self51 tableView .registerClass(DelegateCell.classForCoder(), forCellReuseIdentifier: NSStringFromClass(DelegateCell))52 self.tableView = tableView53 self.view.addSubview(self.tableView!)54 }55 }
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 UIKit10 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 = like32 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 }
在代码中用到了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.size100 }101 set {102 self.frame.size = newValue103 }104 }105 }
在打出protocol DelegateCellDelegate {
func giveLike(btn:UIButton)
}后,发现不能用weak了修饰,代理我们都知道 arc中需要使用weak来避免循环引用造成内存泄漏,此时要在后面加上 :NSObjectProtocol,这样就能用weak来修饰
地址:http://pan.baidu.com/s/1dFbnCMP
swift中代理的使用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。