UITableView在日常中使用频率非常高,是一个非常基础的控件,可以说市面上的App都会用到UITableView
本文用于记录工作中对于TableView的改进与总结
UITableView官方文档
问题一
UITableViewCell是可以重用的,重用需要用到唯一标识符(defaultReuseIdentifier),通过defaultReuseIdentifier去指定重用Cell的类型,常用就是给Cell一个字符串作为defaultReuseIdentifier,但是这样子即使是用常量来作为defaultReuseIdentifier,还是很容易搞错也很容易重复
- 优化
通过对UITableViewCell进行扩展,写一个方法,返回值是类名,因为类名在一个项目中是唯一的,所以也避免了重名的问题
extension UITableViewCell {
@objc static var defaultReuseIdentifier: String {
return String(describing: self)
}
}
在对Cell进行注册与设置的时候可以直接调用这个方法,只要是需要重用的都可以借鉴这个方法,减少重复的代码量
问题二
Swift与OC其中一个区别就是Swift允许传空,如果参数为可选类型那么就需要进行guard let
或者if let
的操作
当我们有若干个自定义的Cell要显示在UITableView上,在代理方法cellForRowAtIndexPath
中,我们每setup一种类型的Cell都需要进行guard let
的操作,这是一个重复繁琐的过程
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: EditorRadioTableViewCell.defaultReuseIdentifier, for: indexPath) as? EditorRadioTableViewCell
else { return UITableViewCell() }
// setup your cell
return cell
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: FoodSafetyItemTableViewCell.defaultReuseIdentifier) as? FoodSafetyItemTableViewCell {
// setup your cell
return cell
}
return UITableViewCell(style: .default, reuseIdentifier: UITableViewCell.defaultReuseIdentifier)
}
- 优化
我们可以写一个Extension来重写dequeueReusableCell
这个方法,返回类型是一个泛型,简化我们的代码
public func dequeueReusableCell<T: UITableViewCell>(_ cellType: T.Type, for indexPath: IndexPath) -> T {
guard let cell = dequeueReusableCell(withIdentifier: cellType.defaultReuseIdentifier, for: indexPath) as? T else {
fatalError("Could not deque cell of type: \(cellType.defaultReuseIdentifier)")
}
return cell
}
- 使用方法
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(DebugMenuCell.self, for: indexPath)
//setup your cell
return cell
}
这样看起来代码简洁渡提高了不少,减少了不必要的繁琐的guard let
操作,这个方法把defaultReuseIdentifier
也直接封在里面了,不需要再自己去写唯一标识符。
待续未完,持续更新
版权所有,谢谢!
网友评论