我的应用程序中有一个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
来获取行的索引,而不是选择行本身?
感谢所有回复的人。
答案 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];