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.h
和DetailCell.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文件的实例。