Подтвердить что ты не робот

Как получить индексный путь ячейки в методах делегата uitextfield?

У меня есть два текстовых поля в пользовательской ячейке, как получить значение indexpath для ячейки Tableview в методах делегата textfield. Я хочу получить входное значение от пользователя и сохранить его в relavent-объекте. пользователь может добавить больше ячеек, нажав кнопку (Добавить больше) в ячейку.

enter image description here

Спасибо в Advance...

4b9b3361

Ответ 1

Обновить до iOS7!

С новыми функциями в iOS7 теперь код должен быть:

UITableViewCell *textFieldRowCell;

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
    // Load resources for iOS 6.1 or earlier
    textFieldRowCell = (UITableViewCell *) textField.superview.superview;

} else {
    // Load resources for iOS 7 or later
    textFieldRowCell = (UITableViewCell *) textField.superview.superview.superview; 
   // TextField -> UITableVieCellContentView -> (in iOS 7!)ScrollView -> Whoola!
}

NSIndexPath *indexPath = [self.tableView indexPathForCell:textFieldRowCell];

Ответ 2

Более динамичное решение (без уровней жесткого кодирования и одного и того же кода для разных версий iOS).

Кроме того, indexPathForCell: не будет работать, если ячейка не видна, поэтому я использую indexPathForRowAtPoint: как обходной путь.

//find the UITableViewcell superview
UIView *cell = textField;
while (cell && ![cell isKindOfClass:[UITableViewCell class]])
    cell = cell.superview;

//use the UITableViewcell superview to get the NSIndexPath
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:cell.center];

Ответ 3

Вот как я это делал, и мне повезло больше. Я захватил начало рамки textField. Преобразуйте это в точку. Затем преобразуйте точку в указательный путь.

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    CGPoint origin = textField.frame.origin;
    CGPoint point = [textField.superview convertPoint:origin toView:self.tableView];

    NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint:point];

    [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];

}

Ответ 4

Попробуйте этот метод, чтобы динамически получать текстовое поле в любом месте вашего контроллера tableview

 #pragma mark - Get textfield indexpath
- (NSIndexPath *)TextFieldIndexpath:(UITextField *)textField
{
    CGPoint point = [textField.superview convertPoint:textField.frame.origin toView:self.TblView];
    NSIndexPath * indexPath = [self.TblView indexPathForRowAtPoint:point];
    NSLog(@"Indexpath = %@", indexPath);
    return indexPath;
}

Ответ 5

Чтобы получить индексную таблицу, попробуйте следующий код.

    UIView *contentView = (UIVIew *)[textfield superview];
    UITableViewCell *cell = (UITableViewCell *)[contentView superview];
    if(IS_IOS7_OR_GREATER) {
        cell = (UITableViewCell *)[[contentView superview] superview];
    }
    NSIndexPath *indexPath = [self.tableview indexPathForCell:cell];

Таты это вы сделали.

Чтобы быть простым,

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

if(IS_IOS7_OR_GREATER) {
    cell = (UITableViewCell *)[[[textfield superview] superview] superview];
}

Проверьте обновленный ответ.

Ответ 6

установите значение cellpath для ячейки в свойство UITextField tag, и вы можете получить доступ к указателю в методах делегата, например textfield.tag

Ответ 7

Вы можете установить теги текстовых полей в cellForRowAtIndexPath: чтобы они сохраняли информацию как для ячейки, так и для текстового поля

Например: если это ячейка в 4-й строке, тег 1-го и 2-го текстовых полей может быть 41 и 42 соответственно. Точно так же теги текстовых полей должны быть 51 и 52 для 5-й строки и т.д.

Затем в методе делегата textfield вы можете получить textfield.tag для определения активного текстового поля.

Ответ 8

Это можно сделать в среде выполнения Objective-C для любого экземпляра (не обязательно должен быть UITextField) с любым ассоциированным объектом (не обязательно должен быть NSIndexPath).

Для этого вопроса мы можем создать категорию UIView+RepresentingIndexPath.

Наш интерфейс позволяет нам установить и получить NSIndexPath:

@interface UIView (RepresentingIndexPath)
- (void)representIndexPath:(NSIndexPath *)indexPath;
- (NSIndexPath *)representedIndexPath;
@end

В нашей реализации используются Objective-C связанные объекты для установки и получения пути указателя в представлении:

#import "UIView+RepresentingIndexPath.h"
#import <objc/runtime.h>

static char IndexPathKey;

@implementation UIView (RepresentingIndexPath)

- (void)representIndexPath:(NSIndexPath *)indexPath
{
    objc_setAssociatedObject(self, &IndexPathKey, indexPath, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSIndexPath *)representedIndexPath
{
    return objc_getAssociatedObject(self, &IndexPathKey);
}

@end

В действии:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    TextFieldTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TextFieldCell" forIndexPath:indexPath];
    [cell.textField addTarget:self action:@selector(textFieldTextChanged:) forControlEvents:UIControlEventEditingChanged];
    [cell.textField representIndexPath:indexPath];
    return cell;
}

- (void)textFieldTextChanged:(UITextField *)sender
{
    NSIndexPath *indexPath = [sender representedIndexPath];
    NSLog(@"%@", indexPath);
}

💣

Одно последнее замечание! Обманывать во время выполнения следует действительно избегать, если вы можете добиться того, что вы пытаетесь сделать, не делая этого. Просто подумал, что добавлю другое решение!

Ответ 9

Я нахожу этот ответ в поиске, как найти индексный путь ячейки внутри UITextField.

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

- (void)searchSelectedIndexPath:(UIView*)view {
    // This allow to find selected index path for a table view cell with a text field inside.
    for (UIView* subview in view.subviews) {
        if ([view isKindOfClass:[UITextField class]]) {
            if ([view isFirstResponder]) {
                UIView *cell = view;
                while (cell && ![cell isKindOfClass:[UITableViewCell class]]) {
                    cell = cell.superview;
                }
                self.selectedIndexPath = [self.tableView indexPathForRowAtPoint:cell.center];
                return;
            }
        }
        [self searchSelectedIndexPath:subview];
    }
}

Таким образом, когда уведомление клавиатуры будет повышаться:

- (void)keyboardDidShow:(NSNotification*)notification {
    [self searchSelectedIndexPath:self.tableView];
}

Ответ 10

В случае, если кому-то вроде меня нужен ответ @Kerkness (этот действительно работал у меня) быстро:

func textFieldDidBeginEditing(_ textField: UITextField) {
    let origin: CGPoint = textField.frame.origin
    let point: CGPoint? = textField.superview?.convert(origin, to: tableView)
    let indexPath: IndexPath? = tableView.indexPathForRow(at: point ?? CGPoint.zero)
    tableView.scrollToRow(at: indexPath!, at: .middle, animated: true)
}

Он должен быть достаточно прямым: вы получаете точку, затем получаете indexPath и делаете все, что вам нужно!