【问题标题】:How to get UITableViewCell's index from its edited UITextField如何从其编辑的 UITextField 中获取 UITableViewCell 的索引
【发布时间】:2011-08-09 14:24:02
【问题描述】:

我正在开发一个基于 iPhone 的 BI 项目。

我在UITextViewCell 中有一个UITextFieldUITextFieldDelegate 指向我的UITableViewController,我还没有对UITextViewCellUITextField 进行任何子分类。

现在在委托上的文本字段结束编辑之后

  -(void)textFieldDidEndEditing:(UITextField*)textField

我需要知道我正在编辑的当前单元格的行索引,有什么方法可以获取文本字段的父单元格吗?或者我可以在创建单元格时为文本字段设置一些属性,如“rowIndex”?我真的需要这个值来保存新文本。

谢谢。愿原力与你同在。

【问题讨论】:

    标签: iphone uitableview uitextfield uitextfielddelegate


    【解决方案1】:

    随着 iOS 7 中 UITableViewCell 类的变化,您必须以更动态的方式访问父单元格。您可以使用以下 sn-p 进入UITextField 的单元格(您应该将其放入textFieldDidEndEditing: 委托方法中)

    // Get the cell in which the textfield is embedded
    id textFieldSuper = textField;
    while (![textFieldSuper isKindOfClass:[UITableViewCell class]]) {
        textFieldSuper = [textFieldSuper superview];
    }
    // Get that cell's index path
    NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)textFieldSuper];
    

    sn-p 适用于 iOS 6 和 iOS 7。

    【讨论】:

    • 我喜欢。即使您更改单元格的视图层次结构,它也始终有效。
    【解决方案2】:

    您要问的真正问题是,当用户在表格单元格的文本字段中输入数据时,如何知道将更改保存到数据模型的位置。

    @Ole Begemann 使用tag 属性的建议是完全有效的。这取决于您的数据模型。如果您只需要一个整数来确定值在模型中的位置,则将该整数存储在每个文本字段的tag 属性中。由于您没有使用节,因此行索引相当于拥有整个索引路径。

    请记住,所有视图都有 tag 属性。因此,您可以将行索引存储在cell.contentView.tag 中,将列索引存储在textField.tag 中。从文本字段中,您将获得带有textField.superview 的内容视图。如果另一个视图是 textField 的父视图,请改用它。

    如果您需要比这更复杂的方法来识别模型中的位置以保存文本字段内容,那么您需要做一些不同的事情。我会继承 UITableViewCellUITextField 并将您需要的任何信息存储在您在子类中定义的属性中。

    【讨论】:

    • 谢谢,这个确实解决了我获取行索引的问题。
    • 这对我有用,但我不得不做(CustomCell *)textField.superview.superview 来获取 Cell 本身,大概 textField 在 contentView 或其他东西中。
    • 是的,我确实提到过。见第 3 段。
    【解决方案3】:

    如果您在UITableViewCell 中添加了UITextField 作为子视图, 所以你可以从你的UITextField'ssuperview属性访问UITableViewCell

    试试下面的。

    UITableViewCell* myCell = (UITableViewCell*)textField.superview ;
    

    如果您遇到任何问题,请告诉我。

    已编辑:

    您将从UITextField So 的标签属性中获取该行

    NSUInteger  myRow = myTextField.tag;
    

    正如你所说,你的应用程序不支持有多个部分,这意味着你的所有行都在 0 部分。

    NSUInteger  mySection = 0;
    

    现在根据上述信息构造一个NSIndexPath 实例。

    NSIndexPath *myIndexPath =[NSIndexPath indexPathForRow:myRow  inSection:mySection]; //Do'nt release myIndexPath instance.
    
    UITableViewCell* myCell = [myTableView cellForRowAtIndexPath:myIndexPath];
    

    现在您的 UITableView

    中有myCell 位于myRow

    【讨论】:

    • 那我怎样才能得到单元格的索引呢?该单元格似乎没有 indexPath 属性
    • 由于 myTextField.tag 已经用于列,我将使用 @XJones 的解决方案来将行保存在 myCell.tag 中。谢谢大家,不过好像只能选择一个答案。
    【解决方案4】:

    对于 iOS 7,它有点不同。 如果 aTextField 是一种对象: UITextField iOS 6: [[aTextField superView] superView]

    iOS 7: [[[aTextField superView] superView] superView]

    Apple 在 UItableViewCell 和它的 contentView 之间添加了一个 ScrollView。

    编辑:滚动视图在 iOS 8 中消失了。

    iOS 8: [[aTextField superView] superView]

    【讨论】:

      【解决方案5】:

      正如其他人所建议的,您可以通过访问文本字段的超级视图来获取当前单元格。从那里,您可以使用UITableView 方法-indexPathForCell: 轻松找到当前单元格的索引路径。

      更新

      虽然我仍然认为上述方法是最简单和最好的方法,但它可能会导致大型表格视图变慢(如果 -indexPathForCell: 涉及线性搜索)。我刚刚读到另一个有趣的想法:将部分和行表示为无符号短裤,将它们打包成一个整数并将结果存储在视图的(文本字段)标签属性中(source)。

      【讨论】:

      • 我认为 'indexPathForCell:' 可能会很慢,因为它可能正在搜索 'UITableView' 的单元格中的单元格。所以我会去@XJones 的。谢谢。
      • @Zhao Xiang:你不知道(文档中没有说这就是正在发生的事情)。据我们所知,索引路径可能已经存储在单元格中。不要过早优化;两种方法都试一下,看看哪种方法可以在轻松和速度之间取得最佳平衡。
      • 我只是假设如果 NSIndexPath 存储在单元格中,这很可能类似于 myCell.indexPath ,但现在我们必须访问 UITableView 以获得单元格的 NSIndexPath ,我认为假设它是通过搜索完成的,对吗?
      • @赵翔:就像我说的,我个人不会假设,直到我尝试过。不过,还有很多其他方法可以做到这一点,所以做最适合你的方法 =)
      【解决方案6】:

      返回tableView:cellForRowAtIndexPath:中的单元格时,可以设置textfield.tag为行索引。

      【讨论】:

      • 那他就得想想其他能识别细胞的数字了。
      • @Ole Begemann,我认为标签用于同一单元格中的 id 不同控件,不是吗?我用它在同一个 UITableViewCell 中标识不同的 UITextField。我可以设置另一个属性吗?谢谢。
      • @Jhaliya:我没有多个部分,但我在一个 UITableViewCell 中有多个 UITextField。有什么建议吗?
      • 您可以将tag 属性用于您想要的任何内容。
      • @Zhao Xiang:如果您没有多个部分,则应该使用@Ole Begemann 解决方案,并且不会影响任何数量的 UIViewField,因为行是唯一的。
      【解决方案7】:

      请记住,如果您有一个很长的单元格表格,这些单元格可能会因为 UITableView 框架的大小而被释放。

      由于 iOS 重复使用单元格,如果您有多个相似的单元格尝试这样做:开始编辑一个 点击 UITextField 的单元格,向下滚动到另一个单元格,直到选定的 UITextField 不在视图中,现在看看 -(void)textFieldDidEndEditing:(UITextField*)textField 方法中发生了什么。 您会注意到 textFiled.superview 是一个 NULL 指针,因为单元已被释放,您无法再访问它。

      我想到的唯一解决方案是通过-(void)textFieldDidBeginEditing:(UITextField*)textField 方法将您需要的单元格属性存储在属性中。

      【讨论】:

        【解决方案8】:

        实际上无需担心当前要编辑的单元格索引。我正在使用此代码

        UIView *tableViewCellView = [[field superview] superview];
        if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
        {
             // Need to traverse one step more up the visual tree
             tableViewCellView = [tableViewCellView superview];
        }
        [self.tableView scrollRectToVisible:[tableViewCellView frame] animated:YES];
        

        结合 BSKeyboardControls 委托方法成功地将所选字段滚动到视图中。用ios5及以上测试过

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多