首发: //www.greatytc.com/p/64c76a587450
本文的上一篇谈及个人对于UITableViewCel的一些观点。这里本来想说说实现方法的。但是看了下,好像也没有什么好说的,代码其实就只有一点点,在这里:
Swift版本:UITableViewCell-Lifecycle-Swift
Objective-C版本:UITableViewCell-Lifecycle
是这样的
- 首先,要实现
cellWillAppear
,大约得在tableView:willDisplayCell:forIndexPath:
中,对各cell进行cellWillAppear
的调用
- 由于
tableView:willDisplayCell:forIndexPath:
是个protocol,并没有默认实现,则需要找到一个其实现的基础 - 由于TableView的delegate可以实现在单独的类中,因此考虑创建一个用于此目的的基类:MDTableViewDelegate,这个类中实现此protocol中的
tableView:willDisplayCell:forIndexPath:
。如此,TableView将其delegate设置到MDTableViewDelegate的子类即可使其cell获得cellWillAppear
的调用。 - 等一下!由于用户可能会override
tableView:willDisplayCell:forIndexPath:
用于自己的实现,因此上面一步还需要一些额外处理。没错,可以用method swizzling创建一个李鬼。 - method swizzling实现在哪?
- 如果直接实现在MDTableViewDelegate中,那么若子类的实现了
tableView:willDisplayCell:forIndexPath:
,则必须显示的调用[super tableView:willDisplayCell:forIndexPath]。详见Swift版本的实现。
- 如果直接实现在MDTableViewDelegate中,那么若子类的实现了
- 如果实现在MDTableViewDelegate的子类中,则其子类完全可以忽略super的调用过程,代价则是需要有一个全体class的遍历过程。详见Objective-C版本的实现
- 各有利弊
另一些好东西
实现cellWillAppear
等事件的过程中,顺便还加入了isCellWillAppeared
的标志位(好吧,也许应该改改名为isCellWillAppearFired
??),标识cellWillAppear
是否是首次调用。
因为这个标志位超级好用,所以我也把相应的一套实现在UIViewController中了。比如viewWillAppear
现在多了一个isViewWillAppeared
(isViewWillAppearFired
??) 来标识viewWillAppear
是否首次调用,用以方便的决定部分参数的设置。