閉包的 聲明與使用
閉包: 實例一 ,閉包 + 屬性
一個視圖控制器 上面 有 一個 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!
//數(shù)據(jù)
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.創(chuàng)建圖片
let tmpImageView = UIImageView.createImageView(nil)
//在線加載圖片
/*
第一個參數(shù):圖片網(wǎng)址的url
第二個參數(shù):默認圖片
第三個參數(shù):選項
第四個參數(shù):可以獲取下載的進度
第五個參數(shù):下載結束的時候的操作
*/
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!)
}
//創(chuàng)建cell的方法
/*
@param tableView:cell所在的表格
@param indexPath:cell在表格上的位置
@param model:cell顯示的數(shù)據(jù)
@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
}
//顯示數(shù)據(jù)
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
}
}
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者