Swift Cell 改造
參考:https://gist.github.com/gonzalezreal/92507b53d2b1e267d49a
- 我們定義一個協(xié)議
Reusable
, 含有一個靜態(tài)變量identifier
. - 然后利用
extension
UIView 泛型, 實(shí)現(xiàn)一個默認(rèn)方法,返回讓identifier
與類型相同 - 這里我的
UIViewController
也實(shí)現(xiàn)了這個協(xié)議邻薯,這個前提是 Storyboard 中設(shè)置的 Storyboard ID 與類名相同, 否則會 crash
/// 可復(fù)用協(xié)議
protocol Reusable: class {
/// 復(fù)用的id
static var identifier: String { get }
}
extension Reusable where Self: UIView {
static var identifier: String {
return NSStringFromClass(self)
}
}
extension UICollectionViewCell: Reusable {}
extension UITableViewCell: Reusable {}
// 這個前提是 Storyboard 中設(shè)置的 Storyboard ID 與類名相同, 否則會 crash
extension UIViewController: Reusable {
static var identifier: String {
let className = NSStringFromClass(self) as NSString
return className.components(separatedBy: ".").last!
}
}
// 調(diào)用時裙戏,就可以這么調(diào)用了
let cell = tableView.dequeueReusableCell(withIdentifier: CustomerCell.identifier)
OC Cell 改造
- 因?yàn)橄扰?swift,然后我又想著把
OC
的代碼也改掉弛说,最開始我想用Category
實(shí)現(xiàn)挽懦,做identifier
肯定是沒問題的,但是我發(fā)現(xiàn)我還可以再多抽取一點(diǎn)重復(fù)的代碼到基類中木人。于是我寫了個BaseCell
信柿,結(jié)果就成了下面這樣冀偶。 - 繼承
SCBaseTableViewCell
然后就不用再寫cellWithTableView
和initWithStyle
@implementation SCBaseTableViewCell
+ (instancetype)cellWithTableView:(UITableView *)tableView {
NSString *identifier = NSStringFromClass(self);
SCBaseTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (!cell) {
cell = [[self alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}
return cell;
}
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
[self setupViews];
}
return self;
}
// 由子類去實(shí)現(xiàn)視圖自定義
- (void)setupViews {}
@end
// 方法調(diào)用
SCActivityCell *cell = [SCActivityCell cellWithTableView:tableView];
cell.model = model;