2013-08-15 1 views
2

У меня есть UITableView в моей заявке, где у меня есть пользовательский , который содержит UITextField. То, что я хотел бы сделать, это получить правильный индекс строки, когда я выбираю конкретное текстовое поле из этой строки. К сожалению, я могу получить правильный индекс строки, если я на самом деле нажимаю на строку, а не когда я выбираю текстовое поле. Я реализации <UITextFieldDelegate>, и когда я выбрать конкретный UITextField, я вызвать метод:Попытка получить индекс активной ячейки из textField внутри пользовательской ячейки UITableView в iOS

- (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, который находится внутри него, вместо выбора самой строки?

Заранее благодарим всех, кто отвечает.

+1

установить 'textField.tag = indexPath.row' in '-tableView: cellForRowAtIndexPath' метод –

+0

Большое спасибо за ваш комментарий, но я уже делаю это. – syedfa

ответ

8

Обычно это делается так, чтобы дать текстовому полю тег, равный indexPath.row, или если у вас есть несколько разделов, какая-то математическая комбинация раздела и строки (например, 1000 * indexPathSection + indexPath.row).

+0

Я делаю это в своем методе cellForRowAtIndexPath, но, как я уже сказал, это значение только кажется меняющимся, когда я выбираю didSelectRowAtIndexPath. – syedfa

+0

@syedfa, я не понимаю, что вы подразумеваете под «это изменяется только при выборе didSelectRowAtIndexPath». Вы не должны проверять _cell.tireCodeField.tag, просто textField.tag – rdelmar

+0

Оказывается, мне пришлось использовать значение смещения при установке значения .tag для текстового поля. Поэтому в моем методе cellForRowAtIndexPath мне пришлось изменить свой код на: cell.textField.tag = indexPath.row + 50; а затем в моем методе textFieldShouldBeginEditing, я сделал это: int row = textField.tag-50; Только после этого он начал работать! – syedfa

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.

+0

Большое спасибо за ваш ответ. Если я использую пользовательский UITableViewCell, я использую этот класс для вызова супервизора текстового поля или я использую UITableViewCell, как вы упомянули выше? – syedfa

+1

@syedfa Да, вы используете свой подкласс. –

+0

Это, похоже, перестало работать с IOS7. Есть идеи? –

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

Я думал, что этот пост немного (!) В конце ответа на вопрос, что я пытался сделать это в течение веков, а затем вспомнить еще один метод (который, если я говорю так себе это один из лучших способов) получения 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! 
} 

Я думаю, что это далеко аккуратнее, чем полагаться на tag с или даже yuckier способа смотреть на superview с!

+0

Спасибо, что нашли время, чтобы предоставить это решение. Лучше поздно, чем никогда :-) – syedfa

+0

На сегодняшний день лучшее решение до сих пор :) – fpg1503

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