2

我的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驻留在其中的行来获取行的索引,而不是选择行本身?

提前感谢所有回复的人。

4

5 回答 5

8

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

于 2013-08-15T15:08:21.160 回答
7

好吧,假设单元格是直接superview或文本字段,您可以直接询问文本字段的superview,转换为UITableViewCell,然后向您的UITableView实例询问该单元格的索引路径。这是一个例子:

- (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引用的以下内容

// 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 所做的那样。

于 2013-08-15T14:53:42.683 回答
4

我想我会发布这个稍微(!)迟到的答案,因为我试图这样做很长时间,然后记住另一种方法(如果我这样说自己是最好的方法之一)获取单元格的索引路径一个UIButton被轻拍了

以类似的方式,您可以获得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!
}

我认为这比依赖s 或更糟糕的查看 s 的方法简洁得多!tagsuperview

于 2014-04-20T19:06:48.010 回答
1

看起来您正在使用标签,使用 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];
}
于 2014-11-22T17:54:02.830 回答
-1
UITableViewCell *textFieldCell = (UITableViewCell*) [[[textfield superview]superview]superview];
    NSIndexPath *indexPath = [self.editProfileTableView indexPathForCell:textFieldCell];
于 2014-01-20T09:12:30.947 回答