如何在动态 UITableView (iPhone) 中处理对 UITextFields 的引用

Posted

技术标签:

【中文标题】如何在动态 UITableView (iPhone) 中处理对 UITextFields 的引用【英文标题】:How to handle references to UITextFields in dynamic UITableView (iPhone) 【发布时间】:2012-05-30 16:53:18 【问题描述】:

我有一个UITableView,它被分解为一个用户定义的号码sections。在每个sections 中总是有 2 个rows。这两个rows 中的每一个都包含一个UITextField,用户可以对其进行编辑。

我需要的是一种能够在以后访问这些UITextFields 中的数据的方法。我希望这将是一个简单的问题,但它给我带来了很大的悲伤。

到目前为止,我已经尝试了两种方法:

尝试 1

我创建了两个NSMutableArrays,其中我将UITextField 对象添加到索引i(对应于它来自的section)。然后我尝试通过遍历数组来访问这些值。这不起作用,因为UITextFields 一直被擦干净。每次我向下滚动表格时,UITextField 就看不见了,当我返回时,它的内容已被清除干净。

尝试 2

我试图在UITableView 中获取sections 的数量(这很好)。然后我想遍历UITableView 中的每个section,记录每个rows 中的值。这就是我陷入困境的地方,因为我不确定如何做到这一点,甚至是否可能。

如果这是一个幼稚的问题,我深表歉意,但我真的很挣扎,希望得到任何建议。

【问题讨论】:

【参考方案1】:

请记住,文本字段会在您滚动时重复使用,因此您并不想存储对它们的引用。

您所做的是在输入信息时捕获信息。最简单的方法是在委托中实现textFieldDidEndEditing 协议方法。

棘手的部分是确定文本字段在哪一行。最好的方法是创建一个具有NSIndexPath 属性的UITableViewCell 子类。然后,您可以在使用 tableview:willDisplayCell:forRowAtIndexPath: 配置单元格时进行设置。

然后,在 textFieldDidEndEditing 中,通过其父视图访问 tableViewCell indexPath 属性。即:

NSIndexPath indexPathOfParentCell = [(MyUITableViewCellSubclass *)self.superview indexPath]; 

这样做可以让您知道单元格的部分和行。

【讨论】:

谢谢。我真的很喜欢这个想法,但是我遇到了一个问题,因为我在子类UITableviewCell 上设置了indexPath,但是当textFieldDidEndEditing 被调用时,我无法访问indexPath(因为它传入的UITextField,而不是UITableViewCell)。你有什么建议吗? 是的,我写这篇文章的时候很着急,抱歉。您要么需要访问文本字段的超级视图,要么将文本字段子类化,然后在 willDisplayCell 中遍历表格视图单元格的所有子视图并设置每个文本字段的 indexPath。 感谢您的帮助。我最终将 UITextField 子类化并在其上添加 NSIndexPath 而不是在 UITableViewCell 上。现在一切正常。再次感谢。【参考方案2】:

像这样在表格的 cellForRow 中创建你的 TextField 并给它一个标签

    UITextField * userField = [[[UITextField alloc] initWithFrame:CGRectMake(0, 12, self.view.frame.size.width -20, 20)] autorelease];
    userField.tag = 1001;
    userField.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:14];
    userField.textAlignment = UITextAlignmentCenter;
    userField.delegate = self;
    userField.autocorrectionType = UITextAutocorrectionTypeNo;
    userField.autocapitalizationType = UITextAutocapitalizationTypeNone;
    userField.clearButtonMode = UITextFieldViewModeWhileEditing;

    if (indexPath.row == 0)
        [cell.contentView addSubview:userField];  

然后像这样访问 TextField:

    UITextField *userField = (UITextField *)[[(UITableViewCell *)[(UITableView *)tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]] contentView] viewWithTag:1001];

【讨论】:

【参考方案3】:

如果您将文本字段的 text 保留在数组中,而不是文本字段本身,那么您的“尝试 1”应该可以正常工作。 (任何试图在数据对象中创建视图或控件的操作都很有可能出错。)

如果内容是单独存储的,那么无论作为表格视图的数据源的什么都应该能够根据部分和行重新填充滚动的单元格。

【讨论】:

以上是关于如何在动态 UITableView (iPhone) 中处理对 UITextFields 的引用的主要内容,如果未能解决你的问题,请参考以下文章

在动态 UITableView 中关闭 iPhone 键盘

具有自动布局的 UITableView 中的动态单元格高度

如何为 UITableView 部分标题动态设置背景颜色?

如何在 iphone 中刷新 UITableView?

如何在 iPhone 的 UIAlertView 中添加 UITableView?

如何在 iPhone 的 Interface Builder 中构建 UITableView 部分的标题视图?