Reusable
Reusable是一個在swift下使用的開源庫奋隶。利用protocol extension結(jié)合泛型提供了一個優(yōu)雅的方案來dequeueReusableCell旬迹。使用 根據(jù)類型獲取cell讓你的cell聲明Reusable或NibReusable協(xié)議
//如果cell定義在xib中沟蔑,聲明NibReusableclass
MyCustomCell: UITableViewCell, NibReusable { }
//如果cell是基于純代碼的,聲明Reusableclass
MyCustomCell: UITableViewCell, Reusable { }
接著在tableview中register
tableView.register(UINib.init(nibName: "MyCustomCell", bundle: nil), forCellWithReuseIdentifier: "MyCustomCell")
在collectionView中使用Reusable register
collectionView.register(cellType: SubscribeCell.self)
collectionView.register(supplementaryViewType: SubscribeHeader.self, ofKind: UICollectionView.elementKindSectionHeader)
collectionView.register(supplementaryViewType: SubscribeFooter.self, ofKind: UICollectionView.elementKindSectionFooter)
在collectionView中沒有使用Reusable register Header和Footer
//返回的是xib
collectionView.register(UINib(nibName: "SubscribeHeader", bundle: nil), forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "SubscribeHeader")
collectionView.register(UINib(nibName: "SubscribeFooter", bundle: nil), forSupplementaryViewOfKind: UICollectionView.elementKindSectionFooter, withReuseIdentifier: "SubscribeFooter")
粗暴的直接獲取cell就可以啦:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:myCell = tableView.dequeueReusableCell(for: indexPath, cellType: MyCustomCell.self)
if dataList.count > indexPath.row{
cell.model = dataList[indexPath.row]
}
return cell
}
是的睁冬。你沒有看錯挎春,這樣就能獲取到這個類型的reuse cell看疙,不需要傳入reuseIdentifiers豆拨,不需要UITableViewCell類型強(qiáng)轉(zhuǎn)直奋。根據(jù)類型獲取xib中的UIView對象 UIView對象聲明NibLoadable協(xié)議。
對比
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "UITableViewCell") ?? UITableViewCell.init(style: .subtitle, reuseIdentifier: "UITableViewCell")
cell.textLabel?.font = UIFont.init(name: "", size: 14.0)
cell.textLabel?.text = self.dataArray[indexPath.row]
return cell
}