2013-04-02 2 views
4

У меня есть UITextField в пользовательской ячейке внутри таблицы. Я создал новый класс DataCell, который является подклассом UITableViewCell. Внутри DataCell я создал точки для текстовых полей, и у меня также есть метод внутри файла реализации, который использует «редактирование завершено», и я управляю значениями textField.Как получить индекс UITableViewCell из UITextField?

Теперь мне интересно, как получить rowIndex или номер ячейки, так как каждый раз, когда я нажимаю кнопку +, новая пользовательская ячейка загружается в таблицу. Если я получаю тег, я всегда получаю одинаковый номер тега независимо от выбранной мной ячейки.

+2

Не можете ли вы установить теги текстовых полей в cellForRowAtIndexPath как indexPath.row? Так я обычно это делаю. – rdelmar

+0

Я новичок, как бы установить это конкретно в построителе интерфейса? –

+1

Вы не можете. Он должен быть установлен в tableView: cellForRowAtIndexPath :, потому что ячейки повторно используются. – rdelmar

ответ

10

Текстовое поле, переданное вашему делегату, является подразделением ячейки contentView.

UITableViewCell *cell = (UITableViewCell*) textField.superview.superview; 
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
+1

Это очень хрупкий, но он будет работать в конкретном случае. –

+0

Этот код написан для этого случая и не является хрупким. – Mundi

+3

Это очень хрупкий: вы полагаетесь на то, что текстовое поле всегда будет существовать, b) привязано к супервину, c) быть, в свою очередь, привязано к ячейке. Хотя, это работает для этого случая. Вы оба правы. – CodaFi

2

Вы можете использовать эту логику, если не уверены в иерархии между текстовым полем и ячейкой.

UITableViewCell *cell = nil; 
UIView *parentView = textField.superview; 
while(parentView) { 
    if([parentView isKindOfClass:[UITableViewCell class]]) { 
     cell = parentView; 
     break; 
    } 
    parentView = parentView.superview; 
} 

if(cell) 
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
+0

Привет, спасибо за ответ. У меня четкая иерархия, однако я получаю ошибку, что tableView не найден на объекте DataCell –

0

Добавить теги в текстовое поле в таблицеView: cellForRowAtIndexPath: method. В этом примере, у меня есть пользовательские ячейки с меткой и текстовое поле:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    RDCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 
    cell.label1.text = self.theData[indexPath.row]; 
    cell.textField.tag = indexPath.row; 
    return cell; 
} 

Это звучит, как вы, возможно, обработку конца редактирования в классе пользовательских ячейки, но вы можете рассмотреть возможность сделать это в вместо этого используется диспетчер табличных представлений, поскольку это дает вам легкий доступ к модели, и я предполагаю, что вы изменяете то, что пользователь вводит в текстовое поле. Если вы это сделаете, вы должны подключить свойство делегирования текстового поля до контроллера табличного представления в IB.

+0

Если вы измените порядок своих ячеек, тогда концепция тега неверна .... – PVCS

0

Если мы принимать хрупкие ответы, то ради содействия что-то новое к разговору:

CGRect rectInTableView = 
    [tableView convertRect:textField.bounds fromView:textField]; 

NSUInteger indexOfCellContainingTextField = 
    (NSUInteger)(rectInTableView.y/tableView.rowHeight); 

Предположения, которые делают его хрупким: (I) все строки имеют одинаковую высоту; (ii) высота устанавливается на виде таблицы. Если вы не выполнили UITableViewDelegate -tableView:heightForRowAtIndexPath:, то оба этих предположения будут считаться истинными. Вы также пользуетесь тем фактом, что приведение положительного поплавка в целое число округляется вниз.

Я бы сказал, что, хотя он все еще не полностью очищен от предположений, он менее хрупкий, чем решение Мунди, потому что он делает предположения только о вещах, которые вы делаете непосредственно (т. Е. Размер ячейки), а не о том, что вы не делаете , иерархия представления UIKit использует внутренне для представления табличных представлений).

Смежные вопросы