我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开发的新手。
答案 0 :(得分:8)
使用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.h
和DetailCell.m
文件,并将NIB文件中的根视图设置为DetailCell类,并为代码中需要访问的所有视图创建参考出口,并为所有人创建操作出口你需要采取的行动。
这可以通过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文件的实例。