iOS - 在自定义 UITableViewCell 中为 UITextField 添加目标/操作

Posted

技术标签:

【中文标题】iOS - 在自定义 UITableViewCell 中为 UITextField 添加目标/操作【英文标题】:iOS - Adding Target/Action for UITextField Inside Custom UITableViewCell 【发布时间】:2012-11-14 09:22:23 【问题描述】:

我有UITableView,它使用自定义UITableViewCell,其中包含UITextField

我想在单击 (UIControlEventTouchDown) 时调用方法 (myMethod) 并尝试通过执行以下操作将其连接到 UITableView 委托方法 cellForRowAtIndexPath 中:

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

点击UITextField 时,什么也没有发生。

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

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

当我点击othertf 时,该方法会按我的预期调用。

我有点困惑,因为除了将tf 换成othertf 之外,代码是相同的。

下面是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 *tf = (UITextField *)[cell viewWithTag:2];给你正确的obj?请检查它是 nil 还是什么 是的,因为它采用在第 11 行分配的值 - tf.text = @"some value"; 【参考方案1】:

使用UITextFielddelegate方法:

UITextField delegate

//Use this method insted of addTarget:
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 

    if (textField == tf) 
        [self myMethod];
        return NO;
    

  return YES;

并且不要忘记将委托设置为文本字段:

 tf.delegate = self;

【讨论】:

检测 EditingChanged 事件的最佳方法是什么?【参考方案2】:

当您触摸 UITextField 时,它会吞下触摸本身并告诉键盘出现等。改为使用以下事件:

UIControlEventEditingDidBegin

UIControlEventEditingDidEnd

UIControlEventEditingChanged

进一步改进

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

这是通过 CTRL 单击界面构建器中的视图并将其拖到 DetailCell.h 文件中来完成的。 Interface Builder 现在会询问您是要创建操作还是引用出口(引用基本上是指针,操作基本上是事件)

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

或者,您可以使用

注册一个 NIB 文件以在 tableview 上重用单元格

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

每次创建新单元格时都会自动加载 nib 文件。在 >= iOS 5 (AFAIK) dequeueReusableCellWithReuseIdentifier 中永远不会返回 nil,而是每次都会自己创建已注册类/nib 文件的实例。

【讨论】:

这会解决问题还是您只是说您更喜欢上述方法?

以上是关于iOS - 在自定义 UITableViewCell 中为 UITextField 添加目标/操作的主要内容,如果未能解决你的问题,请参考以下文章

IOS10 - 在自定义 inputView 中使用 CollectionView

iOS:在自定义 UITableViewCell 中更改 contentView backgroundColor on touchDown

iOS:在自定义视图中添加新约束依赖于视图的框架

iOS - 在自定义 UITableViewCell 中为 UITextField 添加目标/操作

ios) 如何在自定义键盘上方创建建议视图

iOS - WKURLSchemeHandler 未在自定义方案上调用