2

所以我有一个UITableView,其中所有单元格都有一个UITextField作为子视图,其中一个tag=1。令我困扰的是,当用户单击 textField 并对其进行编辑以了解发生在哪一行时,我想要。我认为可以解决的方法是在选择子视图()时使单元格自行UITextField选择。我怎样才能做到这一点?

我尝试了一个数组,但由于单元格被重复使用,它不起作用。循环遍历所有行太慢了。

4

6 回答 6

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是 each 的委托UITextField,您可以在UITextFieldDelegate方法的实现中执行此操作:

-(void)textFieldDidEndEditing:(UITextField *)textField 
{
    [textField setEnabled:NO];
}
于 2013-12-05T18:09:23.710 回答
1

textfield.superview.superview给你单元格实例。使用委托获取操作

于 2013-07-08T09:35:49.473 回答
1

正确的做法是将textFields的边界转换成相对于tableView,然后使用这个rec​​t的原点来获取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];
于 2013-07-08T11:29:49.200 回答
0

使用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 用于此类任务。尤其是级联。

于 2013-07-08T09:43:29.340 回答
0

下面的代码将返回 NSIndexPath。这可以写在UITextField 委托中-

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

试试上面的代码。

于 2013-07-08T09:45:47.753 回答
-2

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

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

    [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:textfield.tag inSection:0] 动画:YES scrollPosition:UITableViewScrollPositionNone];

于 2013-07-08T09:37:13.900 回答