在单个 UITableViewCell 中管理多个 UITextField

Posted

技术标签:

【中文标题】在单个 UITableViewCell 中管理多个 UITextField【英文标题】:Managing multiple UITextField in a single UITableViewCell 【发布时间】:2015-12-22 12:37:36 【问题描述】:

我在单个UITableviewCell 中有多个UITextField。 我知道我们可以使用标签识别UITableViewCell 中的subviews。 但在我的场景中,我在单个 UITableViewCell 中有多个 UITextField

如何提供标签来识别点击了哪个UITextField

【问题讨论】:

每个 UITextfields 的标签,然后您可以比较 row=1、tag=1 等。 @AnoopVaidya:感谢您的回复,但我在单个 UITableViewCell 中有多个文本字段。 是的,为什么你不能为它们每个都设置标签/标识符? @AnoopVaidya:能否详细说明一下? 您可以使用自定义协议和委托方法 【参考方案1】:

当您的UITableViewCell 中有多个UITextFeild's 时,请在您的cellForRowAtIndex 方法中为每个textfield 提供标记。然后当你点击textfield 时,UITextFieldDelegate 就会被击中。

例如,当您点击textfield 时,textFieldShouldBeginEditing 会被击中。

或者,您甚至可以将观察者添加到您的文本字段,然后您可以简单地验证点击了哪个文本字段。

如果考虑委托方法:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

   if(textfield.tag==1)
   
      //you tapped textfield 1
   

【讨论】:

【参考方案2】:

如果我理解正确,由于每个单元格中有多个 textField,因此仅使用该行作为标记仍然无法区分它与该特定行是哪个 textField。

在这些场景中,我通常会在标签中编码 2 个值。

例如你可以这样保存:

textField.tag = indexPath.row * 1000 + TEXTFIELD_INDEX

然后,在该 textField 的委托方法上,您可以像这样检索它:

NSInteger textFieldIndex = textField.tag % 1000;
NSInteger row = textField.tag / 1000;

textField 索引将存储为标记上 1000 的余数,而行本身将存储为千位。

注意:这样做有一个隐含的限制,即每个单元格中最多只能有 1000 个文本字段,大约 2000000 个单元格。假设标签是一个 32 位整数。但我觉得这很合理:)

【讨论】:

【参考方案3】:

您可以在故事板或 nib 文件中设置标签。

选择文本字段,选择右侧的属性选项卡,在视图部分修改标签。

【讨论】:

【参考方案4】:

你可以设置一个标签像

 cell.contentView.subviews.enumerated().forEach  (offset, view) in
    (view as! UITextField).tag = 100 + offset 
 

然后在

extension ViewController:UITextFieldDelegate 

func textFieldDidBeginEditing(_ textField: UITextField) 

  if textField.tag == 101 
    // first textField
   else if textField.tag == 102 
    // second textField
   else 
   // else
  
 

【讨论】:

以上是关于在单个 UITableViewCell 中管理多个 UITextField的主要内容,如果未能解决你的问题,请参考以下文章

从 NSIndexPath 获取 UITableViewCell?

跨多个 UIView 子类的单个 drawRect 实现

UITableViewCell 中单个 UIImageView 应该都有哪些约束?

在单个 NSOperationQueue iOS 中管理多个操作,例如暂停/恢复单个操作

在单个 UICollectionViewController 中管理多个 UICollectionViewLayout

UItableViewCell:移除观察者