尝试从 iOS 中 UITableView 的自定义单元格内的 textField 获取活动单元格的索引

Posted

技术标签:

【中文标题】尝试从 iOS 中 UITableView 的自定义单元格内的 textField 获取活动单元格的索引【英文标题】:Trying to get index of active cell from textField inside custom cell of UITableView in iOS 【发布时间】:2013-08-15 14:46:07 【问题描述】:

我的应用程序中有一个UITableView,其中我有一个自定义UITableViewCell,其中包含一个UITextField。当我从该行中选择特定的文本字段时,我想做的是获得该行的正确索引。不幸的是,如果我实际单击该行,而不是当我选择文本字段本身时,我只能获得该行的正确索引。我正在实现<UITextFieldDelegate>,当我选择一个特定的UITextField时,我调用该方法:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 

    int rowTest = [_table indexPathForSelectedRow].row;
    int rowTest1 = [_cell.tireCodeField tag];

    NSLog(@"the current row is: %d", rowTest1);
    NSLog(@"and this row is: %d", rowTest);  

    return YES;


问题是我得到的行的值来自任何时候的方法:

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

   ...


得到调用。好像UITextField 与其所在的表中的行之间存在断开连接。有没有办法让我选择一个特定的文本字段,并获取

有没有办法让我通过选择其中的UITextField 而不是选择行本身来获取行的索引?

提前感谢所有回复的人。

【问题讨论】:

-tableView:cellForRowAtIndexPath方法中设置textField.tag = indexPath.row 非常感谢您的评论,但我已经这样做了。 【参考方案1】:

通常这样做的方式是给文本字段一个等于 indexPath.row 的标签,或者如果你有多个部分,则部分和行的某种数学组合(如 1000*indexPathSection + indexPath.row) .

【讨论】:

我在我的 cellForRowAtIndexPath 方法中这样做,但正如我所说,这个值似乎只有在我选择 didSelectRowAtIndexPath 时才会改变。 @syedfa,我不明白您所说的“它仅在我选择 didSelectRowAtIndexPath 时才会改变”是什么意思。你不应该检查 _cell.tireCodeField.tag,只检查 textField.tag 事实证明,在为文本字段设置 .tag 值时,我必须使用偏移值。所以在我的 cellForRowAtIndexPath 方法中,我不得不将我的代码更改为: cell.textField.tag = indexPath.row+50;然后在我的 textFieldShouldBeginEditing 方法中,我这样做了: int row = textField.tag-50;只有在这样做之后它才开始工作! @syedfa,使用 int row = textField.tag 应该可以自己工作。你是这样尝试的吗?有时需要使用偏移量,但通常只是为了避免与其他带有标签的视图发生冲突。【参考方案2】:

好吧,假设cell是直接superview或者text field,你可以直接询问text field的superview,强制转换为UITableViewCell,然后向你的UITableView实例询问那个cell的索引路径。这是一个例子:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

    UITableViewCell *cell = (UITableViewCell *)textField.superview; // cell-->textfield
    //UITableViewCell *cell = (UITableViewCell *)textField.superview.superview; // cell-->contentView-->textfield
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

    return YES;

如果您正在寻找适用于多个 ios 版本的更动态的解决方案,那么您可能希望使用 @Marko Nikolovski here 中引用的以下内容

// 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];

此方法向上爬取superview,直到遇到UITableViewCell。即使在单元格的视图层次结构发生变化时,这也能保持代码正常工作,就像从 iOS 6 到 7 所做的那样。

【讨论】:

非常感谢您的回复。如果我使用的是自定义 UITableViewCell,是使用该类调用文本字段的超级视图,还是使用上面提到的 UITableViewCell? @syedfa 是的,你使用你的子类。 这似乎已停止使用 IOS7。有什么想法吗? @T.J.试试superview.superview。单元格的视图层次结构在 iOS 7 中发生了变化,我不记得具体的变化,但只是继续爬上 superview 链,直到你遇到UITableViewCell 我在这里找到了一个很好的解决方案,它以编程方式爬上链:***.com/a/18980944/971518。【参考方案3】:

我想我会发布这个稍微晚一点的(!)答案,因为我已经尝试这样做了很长时间,然后记住另一种获取the index path for a cell when a UIButton was tapped 的方法(如果我自己这么说是最好的方法之一)。

以类似的方式,您可以获得单元格的CGPoint

-(NSIndexPath *)indexPathForTextField:(UITextField *)textField

    CGPoint point = [textField convertPoint:CGPointZero toView:self.tableView];
    return [self.tableView indexPathForRowAtPoint:point];


-(void)textDidChangeForTextFieldInCell:(UITextField *)textField

    NSIndexPath *indexPath = [self indexPathForTextField:textField];
    // Now you can update the object at indexPath for your model!

我认为这比依赖 tags 或查看 superviews 的更糟糕的方法更简洁!

【讨论】:

感谢您抽出宝贵时间提供此解决方案。迟到总比没有好:-) 迄今为止最好的解决方案:)【参考方案4】:

您似乎正在使用标签,使用 UITextFieldDelegate,您可以声明此方法以选择行。

-(void)textFieldDidBeginEditing:(UITextField *)textField

int rowTest1 = textField.tag;

[myTableview selectRowAtIndexPath:[NSIndexPath indexPathForRow:rowTest1 inSection:0] animated:YES scrollPosition:UITableViewScrollPositionNone];



-(void)textFieldDidEndEditing:(UITextField *)textField
[textField resignFirstResponder];

【讨论】:

【参考方案5】:
UITableViewCell *textFieldCell = (UITableViewCell*) [[[textfield superview]superview]superview];
    NSIndexPath *indexPath = [self.editProfileTableView indexPathForCell:textFieldCell];

【讨论】:

以上是关于尝试从 iOS 中 UITableView 的自定义单元格内的 textField 获取活动单元格的索引的主要内容,如果未能解决你的问题,请参考以下文章

防止 UITableView 在自定义子视图处理触摸时滚动

嵌入在 UICollectionViewCell 中的自定尺寸 UITableView

如何在 UITableView 单元格中创建自定尺寸网格?

尝试从 iOS 中 UITableView 的自定义单元格内的 textField 获取活动单元格的索引

在 ios 的 UITableView 或 UICollectionView 中重新加载数据的最佳位置是啥

如何实现自定尺寸 UITableView?