因此,我有一个UITableView
,其中所有单元格中都有一个UITextField
作为tag=1
的子视图。令我感到困扰的是,当用户点击一个textField并编辑它以知道发生了哪一行时,我想要。我认为可以解决的是,当子视图(UITextField
)被选中时,使单元格自己选择。我怎样才能做到这一点?iOS如何选择行,当一个人选择它里面的UITextField?
我尝试过使用数组,但因为单元格被重用,所以不起作用。循环遍历所有行将会非常慢。
因此,我有一个UITableView
,其中所有单元格中都有一个UITextField
作为tag=1
的子视图。令我感到困扰的是,当用户点击一个textField并编辑它以知道发生了哪一行时,我想要。我认为可以解决的是,当子视图(UITextField
)被选中时,使单元格自己选择。我怎样才能做到这一点?iOS如何选择行,当一个人选择它里面的UITextField?
我尝试过使用数组,但因为单元格被重用,所以不起作用。循环遍历所有行将会非常慢。
textfield.superview.superview
为您提供了单元实例。 使用代表来获取动作
最好不要将'superview'用于这样的任务。尤其是级联。仅仅因为你需要对超级视图的类进行一些检查,并且有一些更简单的方法来完成这项工作。 –
@AndreyChevozerov:为什么?为什么需要检查一下?为什么不能使用超视图? –
我同意@AndreyChevozerov关于在级联中使用superview的看法,并且您的答案尤其具有风险,因为没有保证“UITextField”只会在单元格中下两层(可以将其嵌入多个子视图中)。 –
为什么你要为文本字段使用标签? 正确的方法是:
UITextField
做一个出路;indexPath.row
分配给对应的单元格的文本字段;在textFieldShouldBeginEditing
地方用于选择小区的代码:
[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:textfield.tag切入口:0]动画:是的scrollPosition:UITableViewScrollPositionNone];
......苹果确实记录了两种方法。他们同样正确。对于非常小的项目,标签可以节省您的时间。当然,它们也很脆弱,所以对于很多人来说,自定义单元格是最好的选择(特别是在这里,您可以使用文本字段委托)。但是,再次,它不是*不正确*使用标签。 – lxt
如果桌面上有2个或更多部分会怎么样? –
当您有多个部分时,您可以在标签中编码部分编号。这不是一个大问题。 –
使用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在其中一个答案的评论说:
最好是不要使用上海华这样的任务。尤其是级联。下面
相当危险和低性能的解决方案,我想.. –
第二种解决方案?是的,这就是我引用你的原因;)。我不会担心这里的表现太艰难了,我不认为这太糟糕了(只是跟随指针并在这里进行'isa'比较)。 –
代码将返回NSIndexPath.This可以的UITextField委托被写入 -
[tableView indexPathForRowAtPoint:textField.superview.superview.frame.origin];
尝试上面这行代码。
使用坐标来检索单元格。哇。这非常不安全。没有什么能保证'textfield.superview.superview'会返回单元格。文本框可以嵌入多个子视图中。 –
正确的做法是将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];
默认情况下禁用每个细胞的UITextField
和使用您UITableView
委托方法didSelectRowAtIndexPath:
到
UITextField
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];
}
试图用的UITextField委托方法..? –