【问题标题】:I want a UItextField that is in UITableViewCell to become first responder only when the cell touched我希望 UITableViewCell 中的 UItextField 仅在单元格触摸时成为第一响应者
【发布时间】:2011-07-07 16:47:09
【问题描述】:
这就是我想要实现的目标:
我希望 UITableViewCell 中的 UITextField 仅在单元格被触摸时成为第一响应者。我希望文本字段只有在方法中设置为第一响应者时才成为第一响应者:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath`
知道如何实现这一目标吗?当直接触摸文本字段时,永远不会调用tableView:didSelectRowAtIndexPath:。
提前致谢。
【问题讨论】:
标签:
ios
ios4
first-responder
【解决方案1】:
我猜,你有一个自定义的 UITableViewCell。在那你可以有一个 UITextField 成员。对吧?
在自定义cell类中,重写方法,
- (void)setSelected:(BOOL)selected animated:(BOOL)animated:
如果选择 == YES,则将文本字段设为第一响应者。否则,请辞去第一响应者的职务。
【解决方案2】:
让一个对象作为 UITextField 的委托,实现textFieldShouldBeginEditing:;如果尚未选择单元格,则返回 NO。 (如果直接调用 becomeFirstResponder 绕过检查,您可能总是可以从此方法返回 NO。)
【解决方案3】:
为了在选择uitableviewcell 时让textField 成为first responder,请将您的textField 用作您的property,然后调用[self.textField1 becomeFirstResponder];
注意:您将需要与 UITableViewCells 数量一样多的属性,因为每个单元格都有一个 textField。
当一个文本字段被触摸时,编译器将不知道相应的行被选中。
为此,您需要使用tags,例如textField.tag == 0 用于第一个文本字段,textField.tag ==1 用于第二个文本字段,依此类推。在textFieldDidBeginEditing 中,您应该检查标签,然后将该值与选定的相应行链接。
这些有意义吗? :)
【解决方案4】:
首先,您需要一个自定义表格单元格,即您自己的UITableViewCell 子类。在该实现中,您需要实现hitTest: 来确定触摸发生的位置。在该方法中,您可以确定触摸实际上是否在 UITextField 的矩形内,如果是,则使其成为第一响应者。这是我为项目编写的一些代码的示例:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
如果(自我编辑){
if ([昵称 pointInside:[self convertPoint:point toView:nickname] withEvent:nil])
return [昵称 hitTest:[self convertPoint:point toView:nickname] withEvent:event];
return [super hitTest:point withEvent:event];
}
返回[自己的内容视图];
}
在本例中,属性nickname 是自定义 UITableViewCell 内的 UITextField。
self.editing 的情况可能与您的申请相关,也可能不相关。这里的想法是向您展示通常如何使用 hitTest:。