闭包的 声明与使用
闭包: 实例一 ,闭包 + 属性
一个视图控制器 上面 有 一个 scrollView, 滚动视图 包含 三个界面。
三个界面 都是 表视图, 第一个界面 的 第一个 cell 是 滚动视图,CBRecommendADCell
点击 第一个界面 的 每一副 图片, 都有一个 新的 视图控制器。
class CBRecommendADCell: UITableViewCell , 这个是 最上层
class CBRecommendADCell: UITableViewCell {
//public typealias CBCellClosure = (String?, String) -> Void
//MARK:- 这个好 A
//图片的点击事件
var clickClosure: ((String?, String) -> Void)?
// 2 A 声明
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var pageCtrl: UIPageControl!
//数据
var bannerArray: Array<CBRecommendBannerModel>? {
didSet {
//显示UI
showData()
}
}
func showData(){
//删除之前的子视图
for sub in scrollView.subviews {
sub.removeFromSuperview()
}
let cnt = bannerArray?.count
if cnt > 0 {
//0.添加一个容器视图
let containerView = UIView.createView()
scrollView.addSubview(containerView)
//设置约束
containerView.snp_makeConstraints(closure: {
[weak self]
(make) in
make.edges.equalTo(self!.scrollView)
make.height.equalTo(self!.scrollView)
})
var lastView: UIView? = nil
for i in 0..<cnt! {
//1.获取模型对象
let model = bannerArray![i]
//2.创建图片
let tmpImageView = UIImageView.createImageView(nil)
//在线加载图片
/*
第一个参数:图片网址的url
第二个参数:默认图片
第三个参数:选项
第四个参数:可以获取下载的进度
第五个参数:下载结束的时候的操作
*/
let url = NSURL(string: model.banner_picture!)
let image = UIImage(named: "sdefaultImage")
tmpImageView.kf_setImageWithURL(url, placeholderImage: image, optionsInfo: nil, progressBlock: nil, completionHandler: nil)
containerView.addSubview(tmpImageView)
//添加手势
tmpImageView.userInteractionEnabled = true
tmpImageView.tag = 500+i
let g = UITapGestureRecognizer(target: self, action: #selector(tapImage(_:)))
tmpImageView.addGestureRecognizer(g)
//约束
tmpImageView.snp_makeConstraints(closure: { (make) in
make.top.bottom.equalTo(containerView)
make.width.equalTo(kScreenWidth)
if i == 0 {
make.left.equalTo(containerView)
}else{
make.left.equalTo((lastView?.snp_right)!)
}
})
lastView = tmpImageView
}
//修改容器视图的约束
containerView.snp_makeConstraints(closure: { (make) in
make.right.equalTo((lastView?.snp_right)!)
})
//修改分页控件
pageCtrl.numberOfPages = cnt!
//设置代理
scrollView.delegate = self
scrollView.pagingEnabled = true
}
}
func tapImage(g: UIGestureRecognizer) {
let index = (g.view?.tag)!-500
//获取模型对象
let imageModel = bannerArray![index]
//MARK: - B 闭包的 使用
//要将点击事件传到视图控制器
clickClosure!(nil, imageModel.banner_link!)
}
//创建cell的方法
/*
@param tableView:cell所在的表格
@param indexPath:cell在表格上的位置
@param model:cell显示的数据
@param cellClosure:图片点击事件
*/
//MARK:- 很好
class func createAdCellFor(tableView: UITableView, atIndexPath indexPath: NSIndexPath, withModel model: CBRecommendModel,cellClosure: ((String?, String) -> Void)?) -> CBRecommendADCell {
// 3 public typealias CBCellClosure = (String?, String) -> Void
let cellId = "recommendADCellId"
var cell = tableView.dequeueReusableCellWithIdentifier(cellId) as? CBRecommendADCell
if nil == cell {
cell = NSBundle.mainBundle().loadNibNamed("CBRecommendADCell", owner: nil, options: nil).last as? CBRecommendADCell
}
//显示数据
cell?.bannerArray = model.data?.banner
//点击事件
//MARK: - 5 C 闭包 的 传递
cell?.clickClosure = cellClosure
return cell!
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
//MARK: UIScrollView代理
extension CBRecommendADCell: UIScrollViewDelegate {
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
let index = Int(scrollView.contentOffset.x/scrollView.bounds.size.width)
pageCtrl.currentPage = index
}
}