Xamarin.iOS 代码添加按钮到UITableViewCell点击无响应
问题描述
我正在学习如何通过代码方式向UITableViewCell中添加UIView。我知晓可以通过storyboard实现该操作,但我需要采用纯代码方式完成控件添加。
为测试效果我编写了如下代码,但点击按钮时没有任何响应,绑定的test()测试方法始终不会被触发,以下是存在问题的测试代码:
var cell = tableView.DequeueReusableCell(CellIdentifier) as TestCell; var cellWidth = cell.Frame.Width; var cellheight = cell.Frame.Height; UIButton testing = new UIButton(); testing.SetTitle("TestBtn", UIControlState.Normal); testing.Frame = new CGRect(0, 0, cellWidth, cellheight); testing.BackgroundColor = UIColor.Green; testing.TouchUpInside += (sender, e) => { test(); }; testing.UserInteractionEnabled = true; cell.AddSubview(testing); return cell;
问题排查与修复方案
你的代码一共遗漏了3处关键配置,同时存在1处复用逻辑隐患,按以下顺序修改即可解决点击无响应的问题:
- 子视图添加层级错误
UITableViewCell的所有自定义子视图都必须添加到它的ContentView属性上,直接添加到cell根视图上的交互控件会被tableView的选中手势、cell内部的事件拦截机制屏蔽,无法接收触摸事件。将cell.AddSubview(testing)替换为cell.ContentView.AddSubview(testing)即可修复该问题。 - 视图尺寸赋值时机错误
刚从复用池出队的cell还未完成最终布局,此时读取的cell.Frame.Width、cell.Frame.Height不是最终显示的真实尺寸,大概率会出现按钮frame为0、超出父视图边界的情况,超出父视图边界的控件是无法接收点击事件的。
你可以给按钮添加自适应掩码来自动匹配cell尺寸:testing.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight;,也可以重写TestCell的LayoutSubviews方法,在该方法内更新按钮的frame。 - 复用逻辑错误
你当前把按钮创建、添加的逻辑写在了GetCell方法里,每次cell被复用时都会新建一个按钮叠加到cell上,多次滑动后cell上会叠放多个同位置按钮,最上层的按钮可能没有绑定点击事件,自然无法触发test()方法。你需要把按钮的创建、事件绑定、基础属性配置的逻辑移到TestCell的构造方法中,保证每个cell只会创建一次按钮,GetCell方法里只做内容更新即可。
注意:即使你给按钮设置了UserInteractionEnabled = true,以上三个问题任意一个存在,都会导致按钮无法正常响应点击。
内容的提问来源于stack exchange,提问作者Malin
相关产品推荐
相关产品推荐

