一些老项目突然出现的这个问题:
cell上的按钮点击没有任何反应,断点调试后发现:不仅没有走block,
而且,连Button自己的Action 都没有走。
1. 打开图层看了一下:
发现cell的contentView
覆盖到了Button上边:
然后我把Button按照我自己的编写习惯加到了cell的contentView上,解决了问题。
2.为什么contentView会跑到了视图最上层?
通过添加 -[UIView addSubview:]的Symbolic BreakPoint的断点,来获取TableViewCell 添加 contentView的具体时机和调用堆栈。
ContentView 添加到Cell上的时机:
在iOS14以前:
contentView是在[UITableViewCell initWithStyle:resueIdentifier]的初始化时第一个添加到View上。所以在最底层。
3.结论:在iOS14上cell的contentView 使用的是懒加载
的方式生成
在 cell即将要显示时,调用
-[UITableView _configureCellForDisplay:forIndexPath:]_block_invoke的时候需要调整ContentView的布局,懒加载生成ContentView 并加载到Cell上。
再通过对比iOS13和iOS14的Cell的初始化方法[UITableViewCell initWithStyle:reuseIdentifier:]断点调试。
发现 iOS14上Cell的init方法多出了_UITableViewCellEnableLazyContentView的方法,可以完全不用懂汇编,通过方法名就可以知道在iOS14上ContentView使用的是懒加载生成的。
_UITableViewCellEnableLazyContentView是一个默认返回true的方法,返回值为true的话在Cell的初始化方法中默认不初始化ContentView。 而是在调用的时候才创建ContentView并添加到Cell上。
4.解决方法
在addSubView(redButton)之前随便调用一下contentView的lazy方法,就可以了