ios 14 自定义cell上按钮点击没有反应[已解决]

一些老项目突然出现的这个问题:
cell上的按钮点击没有任何反应,断点调试后发现:不仅没有走block,
而且,连Button自己的Action 都没有走。

1. 打开图层看了一下:

发现cell的contentView覆盖到了Button上边:

ios 14 自定义cell上按钮点击没有反应[已解决]_第1张图片
yg_contentView.jpeg

然后我把Button按照我自己的编写习惯加到了cell的contentView上,解决了问题。



2.为什么contentView会跑到了视图最上层?

通过添加 -[UIView addSubview:]的Symbolic BreakPoint的断点,来获取TableViewCell 添加 contentView的具体时机和调用堆栈。

ios 14 自定义cell上按钮点击没有反应[已解决]_第2张图片
yg_breakpoint_1.png
yg_breakpoint_2.png

ContentView 添加到Cell上的时机:
在iOS14以前:
contentView是在[UITableViewCell initWithStyle:resueIdentifier]的初始化时第一个添加到View上。所以在最底层。

ios 14 自定义cell上按钮点击没有反应[已解决]_第3张图片
image

3.结论:在iOS14上cell的contentView 使用的是懒加载的方式生成

在 cell即将要显示时,调用
-[UITableView _configureCellForDisplay:forIndexPath:]_block_invoke的时候需要调整ContentView的布局,懒加载生成ContentView 并加载到Cell上。

ios 14 自定义cell上按钮点击没有反应[已解决]_第4张图片
image

再通过对比iOS13和iOS14的Cell的初始化方法[UITableViewCell initWithStyle:reuseIdentifier:]断点调试。

发现 iOS14上Cell的init方法多出了_UITableViewCellEnableLazyContentView的方法,可以完全不用懂汇编,通过方法名就可以知道在iOS14上ContentView使用的是懒加载生成的。
_UITableViewCellEnableLazyContentView是一个默认返回true的方法,返回值为true的话在Cell的初始化方法中默认不初始化ContentView。 而是在调用的时候才创建ContentView并添加到Cell上。

ios 14 自定义cell上按钮点击没有反应[已解决]_第5张图片
image

4.解决方法

在addSubView(redButton)之前随便调用一下contentView的lazy方法,就可以了

你可能感兴趣的:(ios 14 自定义cell上按钮点击没有反应[已解决])