2013-07-08 12 views
2

因此,我有一个UITableView,其中所有单元格中都有一个UITextField作为tag=1的子视图。令我感到困扰的是,当用户点击一个textField并编辑它以知道发生了哪一行时,我想要。我认为可以解决的是,当子视图(UITextField)被选中时,使单元格自己选择。我怎样才能做到这一点?iOS如何选择行,当一个人选择它里面的UITextField?

我尝试过使用数组,但因为单元格被重用,所以不起作用。循环遍历所有行将会非常慢。

+1

试图用的UITextField委托方法..? –

回答

1

textfield.superview.superview为您提供了单元实例。 使用代表来获取动作

+0

最好不要将'superview'用于这样的任务。尤其是级联。仅仅因为你需要对超级视图的类进行一些检查,并且有一些更简单的方法来完成这项工作。 –

+0

@AndreyChevozerov:为什么?为什么需要检查一下?为什么不能使用超视图? –

+0

我同意@AndreyChevozerov关于在级联中使用superview的看法,并且您的答案尤其具有风险,因为没有保证“UITextField”只会在单元格中下两层(可以将其嵌入多个子视图中)。 –

-2

为什么你要为文本字段使用标签? 正确的方法是:

  1. 为单元格创建自定义类;
  2. 为您的UITextField做一个出路;
  3. 创建单元格时,将视图控制器分配为单元格文本字段的代表;
  4. 将标签== indexPath.row分配给对应的单元格的文本字段;
  5. textFieldShouldBeginEditing地方用于选择小区的代码:

    [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:textfield.tag切入口:0]动画:是的scrollPosition:UITableViewScrollPositionNone];

+1

......苹果确实记录了两种方法。他们同样正确。对于非常小的项目,标签可以节省您的时间。当然,它们也很脆弱,所以对于很多人来说,自定义单元格是最好的选择(特别是在这里,您可以使用文本字段委托)。但是,再次,它不是*不正确*使用标签。 – lxt

+0

如果桌面上有2个或更多部分会怎么样? –

+0

当您有多个部分时,您可以在标签中编码部分编号。这不是一个大问题。 –

0

使用UITextFieldDelegate知道当用户开始编辑UITextField(与textFieldDidBeginEditing:)。

两种解决方案则:

解决方案1 ​​:子类的细胞,并使其成为UITextField的代表。

然后在您的自定义单元格的textFieldDidBeginEditing:,使所选的小区:

// MyCustomCell.m 
- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    [self setSelected:YES animated:YES]; 
} 

解决方案2:使视图控制器UITextField代表,并从中选择合适的细胞。

// MyTableViewController.m 
- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    // Find the cell containing our UITextField 
    UIView *cell = textField.superview; 
    while (![cell isKindOfClass:[UITableViewCell class]]) 
    { 
     cell = cell.superview; 
    } 

    // Make the cell selected 
    [(UITableViewCell *)cell setSelected:YES animated:YES]; 
} 

我建议你第一个解决方案,如安德烈Chevozerov在其中一个答案的评论说:

最好是不要使用上海华这样的任务。尤其是级联。下面

+0

相当危险和低性能的解决方案,我想.. –

+0

第二种解决方案?是的,这就是我引用你的原因;)。我不会担心这里的表现太艰难了,我不认为这太糟糕了(只是跟随指针并在这里进行'isa'比较)。 –

0

代码将返回NSIndexPath.This可以的UITextField委托被写入 -

[tableView indexPathForRowAtPoint:textField.superview.superview.frame.origin]; 

尝试上面这行代码。

+0

使用坐标来检索单元格。哇。这非常不安全。没有什么能保证'textfield.superview.superview'会返回单元格。文本框可以嵌入多个子视图中。 –

1

正确的做法是将textFields边界转换为与tableView相对的位置,然后使用此矩形的原点获取indexPath。

CGRect rect = [self.tableView convertRect:textField.bounds fromView:textField]; 
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:rect.origin]; 
[self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionMiddle]; 
2

默认情况下禁用每个细胞的UITextField和使用您UITableView委托方法didSelectRowAtIndexPath:

  1. 商店indexPath在属性选择行
  2. 启用UITextField
  3. 使UITextField第一响应者

定义属性在类的扩展:

@interface MyTableViewController() 
@property (strong, nonatomic) NSIndexPath *activeIndex; 
@end 

在你执行didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    self.activeIndex = indexPath; 
    AddCell *selectedCell = (AddCell *)[self.tableView cellForRowAtIndexPath:indexPath]; 
    [selectedCell.textField setEnabled:YES]; 
    [selectedCell.textField becomeFirstResponder]; 
} 

你会想再次禁用UITextField时辞职第一响应者的地位。

假设你UITableViewController是每个UITextField代表,您可以在执行UITextFieldDelegate方法做到这一点:

-(void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    [textField setEnabled:NO]; 
}