iOS - 为自定义UITableViewCell内的UITextField添加目标/操作

时间:2012-11-14 09:22:23

标签: ios objective-c uitableview cocoa-touch uikit

UITableView使用包含UITableViewCell的自定义UITextField

我想在点击(myMethod)时调用方法(UIControlEventTouchDown)并尝试通过执行此操作将UITableView委托方法cellForRowAtIndexPath中的方法连接起来以下内容:

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

单击UITextField时,没有任何反应。

我尝试对UITextField以外的其他UITableView做同样的事情:

[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开发的新手。

2 个答案:

答案 0 :(得分:8)

使用UITextField delegate方法:

UITextField delegate

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

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

  return YES;
}

并且不要忘记将委托设置为textField:

 tf.delegate = self;

答案 1 :(得分:1)

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

UIControlEventEditingDidBegin

UIControlEventEditingDidEnd

UIControlEventEditingChanged

进一步改进

标签是一种相当松散的耦合NIB和代码的方式。考虑制作DetailCell.hDetailCell.m文件,并将NIB文件中的根视图设置为DetailCell类,并为代码中需要访问的所有视图创建参考出口,并为所有人创建操作出口你需要采取的行动。

enter image description here

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

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

或者,您可以使用

在tableview上注册NIB文件以便重复使用单元格
  

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

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