3

我有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该方法时,正如我所期望的那样。

我有点困惑,因为除了我换成tfothertf.

下面是完整的代码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 开发的新手。

4

2 回答 2

8

使用UITextField delegate方法:

UITextField 委托

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

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

  return YES;
}

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

 tf.delegate = self;
于 2012-11-14T09:27:58.490 回答
1

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

UIControlEventEditingDidBegin

UIControlEventEditingDidEnd

UIControlEventEditingChanged

进一步改进

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

在此处输入图像描述

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

dequeueReusableCellWithReuseIdentifier现在initWithFrame每次调用 DetailCell 类都会创建它的新实例。现在您的工作是在此函数中加载 NIB 文件。

或者,您可以注册一个 NIB 文件以在 tableview 上重用单元格

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

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

于 2012-11-14T10:08:46.203 回答