所以我有一个UITableView
,其中所有单元格都有一个UITextField
作为子视图,其中一个tag=1
。令我困扰的是,当用户单击 textField 并对其进行编辑以了解发生在哪一行时,我想要。我认为可以解决的方法是在选择子视图()时使单元格自行UITextField
选择。我怎样才能做到这一点?
我尝试了一个数组,但由于单元格被重复使用,它不起作用。循环遍历所有行太慢了。
所以我有一个UITableView
,其中所有单元格都有一个UITextField
作为子视图,其中一个tag=1
。令我困扰的是,当用户单击 textField 并对其进行编辑以了解发生在哪一行时,我想要。我认为可以解决的方法是在选择子视图()时使单元格自行UITextField
选择。我怎样才能做到这一点?
我尝试了一个数组,但由于单元格被重复使用,它不起作用。循环遍历所有行太慢了。
默认情况下禁用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
是 each 的委托UITextField
,您可以在UITextFieldDelegate
方法的实现中执行此操作:
-(void)textFieldDidEndEditing:(UITextField *)textField
{
[textField setEnabled:NO];
}
textfield.superview.superview
给你单元格实例。使用委托获取操作
正确的做法是将textFields的边界转换成相对于tableView,然后使用这个rect的原点来获取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];
使用UITextFieldDelegate
了解用户何时开始编辑 a 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];
}
我推荐第一个解决方案,正如 Andrey Chevozerov 在其中一个答案的评论中所说:
最好不要将 superview 用于此类任务。尤其是级联。
下面的代码将返回 NSIndexPath。这可以写在UITextField 委托中-
[tableView indexPathForRowAtPoint:textField.superview.superview.frame.origin];
试试上面的代码。
为什么要为文本字段使用标签?正确的方法是:
UITextField
;indexPath.row
相应单元格的文本字段;放置textFieldShouldBeginEditing
用于选择单元格的代码:
[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:textfield.tag inSection:0] 动画:YES scrollPosition:UITableViewScrollPositionNone];