示例程序
要運行示例項目缎玫,克隆倉庫硬纤,并首先從Example
目錄運行' pod install '。
安裝與使用
UITableViewAgent可以通過CocoaPods獲得赃磨。安裝
在你的Podfile中添加以下代碼:
pod 'UITableViewAgent'
運行條件:iOS 9.0+ (Swift 5+)
UITableViewAgent可以承擔UITableViewDataSource和UITableDelegate的指責筝家,讓TableView的編碼變得更加容易和充滿樂趣。為什么要使用UITableViewAgent呢邻辉?請看下文溪王。
使用UITableViewDataSource和UITableViewDelegate實現(xiàn)TableView數(shù)據(jù)呈現(xiàn)
讓我們來看看傳統(tǒng)的TableView編碼:
- 設置tableView的代理
tableView.dataSource = self
tableView.delegate = self
- 代理回調(diào)
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if section == 0 {
return self.news.newslist?.count ?? 0
} else if section == 1 {
return 1
} else {
return 10
}
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.section == 0 {
return UITableView.automaticDimension
} else if indexPath.section == 1 {
return 80.0
} else {
return 100.0
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.section == 0 {
let cell = tableView.dequeueReusableCell(withIdentifier: "NewsListTableViewCell", for: IndexPath) as! NewsListTableViewCell
cell.lblTitle.text = self.news.newslist![indexPath.row].title
cell.lblSubTitle.text = self.news.newslist![indexPath.row].source
return cell
} else if indexPath.section == 1 {
let cell = tableView.dequeueReusableCell(withIdentifier: "AppliancesTableViewCell", for: IndexPath) as! AppliancesTableViewCell.self
cell.lblName.text = self.appliances!.name
cell.lblColor.text = self.appliances!.color
cell.lblPrice.text = "\(self.appliances!.price)"
return cell
} else {
let cell = tableView.dequeueReusableCell(withIdentifier: "PersonTCell.self", for: IndexPath) as! PersonTCell
cell.lblName.text = "人物 - \(indexPath.row)"
return cell
}
}
嗯...這里實現(xiàn)了一個多類型Cell和多種數(shù)據(jù)的TableView列表展示,這里沒有列舉出Header與Footer的復用值骇,也沒有列出Cell選中某行時的回調(diào)莹菱。
類似這樣的代碼實現(xiàn)有諸多的缺點:
- 代碼量大:實現(xiàn)簡單的功能需要大量代碼,影響開發(fā)效率雷客。
- 靈活性差:配置數(shù)據(jù)和UI不夠靈活芒珠,多個類的復用視圖的處理需要繁瑣判斷桥狡,開發(fā)者需要自行計算索引值已經(jīng)行數(shù)等不必要的數(shù)據(jù)搅裙。
- 可閱讀性差:為了遵守TableView的代理函數(shù),形式上寫入大量代碼裹芝,卻沒有直觀地凸顯出數(shù)據(jù)和UI部逮。
使用UITableViewAgent實現(xiàn)TableView數(shù)據(jù)呈現(xiàn)
定制Cell數(shù)據(jù)行
tableViewAgent = UITableViewAgent(tableView: tableView, display: UITableViewDisplay({ sections in
sections.append(UITableViewSectionDisplay({ rows in
for i in 0..<10 {
rows.append(UITableViewRowDisplay(cellHeight: 60, cellType: UITableViewCell.self, reuseType: .anyClass) { tableView, indexPath, cell in
cell.textLabel?.text = "row: _ \(i)"
} didSelectRowAtIndexPath: {[weak self] tableView, indexPath, cell in
guard let self = self else { return }
let vc = TraditionalListViewController()
self.navigationController?.pushViewController(vc, animated: true)
})
}
}))
}))
只需要這里少許的代碼即可實現(xiàn)10行行高為50.0像素點,類型為UITableViewCell
的Cell,選中某一行時嫂易,通過其中didSelectRowAtIndexPath
回調(diào)方法實現(xiàn)響應的操作兄朋。
當然,功能遠遠不只這么簡單怜械,若需要比較復雜的需求颅和,它的優(yōu)勢將體現(xiàn)得更加明顯傅事。
比如:
- Cell行數(shù)免計算靈活配置
- 各行Cell高度靈活配置
- 各行Cell類型與復用形式靈活配置
- 各行Cell的數(shù)據(jù)展示靈活配置
- 各行Cell點擊響應事件的靈活配置
// 添加一行Cell展示動物信息
rows.append(UITableViewRowDisplay(cellHeight: 100, cellType: PersonTCell.self, reuseType: .nib) { tableView, indexPath, cell in
cell.name.text = "Panda"
cell.country.text = "China"
} didSelectRowAtIndexPath: { tableView, indexPath, cell in
// 選中動物Cell后回調(diào)
tableView.deselectRow(at: indexPath, animated: true)
print("Animal is selected:", tableView, indexPath, cell)
})
// 添加若干行Cell展示人物信息
for (i, person) in persons.enumerated() {
rows.append(UITableViewRowDisplay(cellHeight: 60, cellType: PersonCell.self, reuseType: .anyClass) { tableView, indexPath, cell in
cell.numberLabel.text = "Number is: \(i)"
cell.nameLabel.text = person.name
cell.genderLabel.text = person.gender
}
}
// 添加電器Cell展示電視信息
rows.append(UITableViewRowDisplay(cellHeight: 120, cellType: AppliancesTableViewCell.self, reuseType: .nib) { tableView, indexPath, cell in
cell.lblName.text = "TV"
} didSelectRowAtIndexPath: { tableView, indexPath, cell in
// 選中電器Cell后回調(diào)
tableView.deselectRow(at: indexPath, animated: true)
print("This is a TV")
})
定制數(shù)據(jù)組
下列是展示一個新聞相關(guān)的組:
// 增加新聞section, header高度45,不允許自動行高(自動行高需要Cell的約束支持峡扩,即內(nèi)容決定Cell高度)蹭越,header復用形式為XIB,類型為NewsListTableHeaderView
sections.append(UITableViewSectionDisplay(headerHeight: 45.0, isAutoHeaderHeight: false, headerReuse:.nib(NewsListTableHeaderView.self, { tabelView, section, header in
// 給header設置標題
header.lblName.text = "News Header"
}), { rows in
// row.append(XXX)
// row.append(XXX)
}, footerHeight: 50.0, isAutoFooterHeight: false, footerReuse: .anyClass(NewsListTableFooterView.self, { tableView, section, footer in
// footer高度50教届,不允許自動行高响鹃,header復用形式為anyClass,類型為NewsListTableFooterView,設置文本標簽展示內(nèi)容
footer.lblDesc.text = "News Footer"
})))
header和footer的復用參數(shù)(headerHeight和footerReuse)可以設定類型如下:
- .anyClass: 純代碼型視圖案训,繼承自UIView买置。
- .nib: XIB型視圖,繼承自UITableHeaderFooterView强霎。
- .none: 不設定Header或Footer忿项。
作者
Chen Bo(陳波), cba023@hotmail.com
證書
UITableViewAgent在MIT許可下可用。查看許可文件以獲得更多信息脆栋。