iOS – 在UITableViewCell里面添加UITextField的Target / Action

我有UITableView使用包含UITextField的自定义UITableViewCell

我想调用一个方法( myMethod ),当它被点击( UIControlEventTouchDown ),并尝试通过执行以下步骤在UITableView委托方法cellForRowAtIndexPath内连线:

 [tf addTarget:self action:@selector(myMethod) forControlEvents:UIControlEventTouchDown]; 

UITextField被点击时,没有任何反应。

我试图为UITableView之外的另一个UITextField做同样的事情:

 [othertf addTarget:self action:@selector(myMethod) forControlEvents:UIControlEventTouchDown]; 

当我点击othertf ,就像我期望的那样调用该方法。

我有点困惑,因为代码是相同的,除了我换了othertf tf

以下是cellForRowAtIndexPath的完整代码:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *DetailCellIdentifier = @"DetailFieldView"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:DetailCellIdentifier]; if (cell == nil) { NSArray *cellObjects = [[NSBundle mainBundle] loadNibNamed:DetailCellIdentifier owner:self options:nil]; cell = (UITableViewCell*) [cellObjects objectAtIndex:0]; } cell.selectionStyle = UITableViewCellSelectionStyleNone; UITextField *tf = (UITextField *)[cell viewWithTag:2]; tf.text = @"some value"; [othertf addTarget:self action:@selector(myMethod) forControlEvents:UIControlEventTouchDown]; [tf addTarget:self action:@selector(myMethod) forControlEvents:UIControlEventTouchDown]; return cell; } 

任何人都可以发现我做错了什么? 这可能是简单的,因为我是iOS开发新手。

使用UITextField delegate方法:

UITextField委托

 //Use this method insted of addTarget: - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { if (textField == tf) { [self myMethod]; } } 

并且不要忘记将代理设置为textField:

  tf.delegate = self; 

当你触摸一个UITextField时,它会吞下触摸本身,并告诉键盘出现等等,而不是使用下面的事件:

 UIControlEventEditingDidBegin UIControlEventEditingDidEnd UIControlEventEditingChanged 

进一步改进

标签是一个相当宽松的方式来耦合你的NIB和你的代码。 考虑制作DetailCell.hDetailCell.m文件,并将NIB文件中的根视图设置为DetailCell类,并为需要在代码中访问的所有视图创build参考插口,并为您需要的所有操作作出反应。

在这里输入图像说明

这是通过CTRL在界面生成器中单击视图并将其拖入DetailCell.h文件来完成的。 界面生成器现在会问你是否要创build一个动作或引用出口(引用基本上是指针,动作基本上是事件)

dequeueReusableCellWithReuseIdentifier现在每次在您的DetailCell类上调用initWithFrame都会创build一个新的实例。 现在你的工作是在这个函数中加载NIB文件。

或者,您可以在桌面视图上注册一个NIB文件用于单元重用

[tableview registerNib:[UINib nibWithNibName:DetailCellIdentifier bundle:nil] forCellWithReuseIdentifier: DetailCellIdentifier];

每创build一个新的单元格时自动加载nib文件。 In> = iOS 5(AFAIK) dequeueReusableCellWithReuseIdentifier永远不会返回nil ,但每次都创build注册类/ nib文件的实例。