(iOS)给TableViewCell加上生命周期事件(如cellWillAppear)(下)

生命周期(图片来自网络)
首发: http://www.jianshu.com/p/64c76a587450

本文的上一篇谈及个人对于UITableViewCel的一些观点。这里本来想说说实现方法的。但是看了下,好像也没有什么好说的,代码其实就只有一点点,在这里:
Swift版本:UITableViewCell-Lifecycle-Swift
Objective-C版本:UITableViewCell-Lifecycle

是这样的

  1. 首先,要实现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的子类中,则其子类完全可以忽略super的调用过程,代价则是需要有一个全体class的遍历过程。详见Objective-C版本的实现
  • 各有利弊

另一些好东西

实现cellWillAppear等事件的过程中,顺便还加入了isCellWillAppeared的标志位(好吧,也许应该改改名为isCellWillAppearFired??),标识cellWillAppear是否是首次调用。
因为这个标志位超级好用,所以我也把相应的一套实现在UIViewController中了。比如viewWillAppear现在多了一个isViewWillAppeared (isViewWillAppearFired??) 来标识viewWillAppear是否首次调用,用以方便的决定部分参数的设置。

你可能感兴趣的:((iOS)给TableViewCell加上生命周期事件(如cellWillAppear)(下))