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

时间:2013-08-15 14:46:07

标签: ios uitableview uitextfield uitextfielddelegate

我的应用程序中有一个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和它所在的表中的行之间存在脱节。有没有办法让我选择一个特定的textField,然后获取

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

感谢所有回复的人。

5 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:7)

好吧,假设单元格是直接超级视图或文本字段,您可以直接询问文本字段的超级视图,强制转换为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 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一样。

答案 2 :(得分:4)

我以为我会发布这个稍微(!)迟到的回答,因为我试图这么做多年,然后记住另一种方法(如果我这样说,我自己是最好的方法之一)获得{{3} }。

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

我认为比依赖tag或更加平庸的查看superview s的方法更为简洁!

答案 3 :(得分: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];
}

答案 4 :(得分:-1)

UITableViewCell *textFieldCell = (UITableViewCell*) [[[textfield superview]superview]superview];
    NSIndexPath *indexPath = [self.editProfileTableView indexPathForCell:textFieldCell];