Arhn - архитектура программирования

Вернуть NSIndexPath из пользовательской ячейки? (UITableView)

Мне нужно получить NSIndexPath для пользовательской ячейки в UITableView. Вот проблема: я отправляю NSNotification из своей пользовательской ячейки в свою UITableViewController, когда editingDidBegin вызывается из UITextField в моей пользовательской ячейке. В моем UITableViewController я изменяю размер UITableView, когда UITextField начинает редактировать, а затем хочу, чтобы табличное представление прокручивалось до ячейки, в которой UITextField отвечает первым. Но я не могу понять, как вернуть indexPath ячейки, где редактируется UITextField. Я пробовал так много способов, но это все еще не работает. Один из способов таков: в моем классе cstomCell я выбираю строку, используя [self setSelected:YES], а в моем ТВ-контроллере, если я NSLog выбираю строку [self.tableV indexPathForSelectedRow], она всегда возвращает 0, даже если она всегда не 0.


  • не могли бы вы просто получить его frame? 14.09.2011

Ответы:


1

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

UITableViewCell *cell = (UITableViewCell *)[self.tableView viewWithTag:tagValue];

затем, когда у вас есть ячейка, вы можете получить NSIndexPath следующим образом

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

Поскольку у вас есть UITextField в пользовательской ячейке, вы можете поместить cell.textField.delegate = self; в

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

метод источника данных. Таким образом, вам не нужно будет настраивать NSNotification в пользовательской ячейке. Также в этом же методе вы можете пометить как текстовое поле вашей ячейки, как это cell.textField.tag = indexPath.row;, так и ячейку, как это cell.tag = indexPath.row;

Теперь, когда вы установили делегат UITextField, вы можете поместить этот метод в свой класс UITableViewController.

- (void)textFieldDidBeginEditing:(UITextField *)textField {

    CustomCell *cell = (CustomCell *)[self.tableView viewWithTag:textField.tag];

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

}

Приведенный выше метод делегата UITextField должен предоставить вам indexPath для ячейки, которую вы выбрали в данный момент.

08.09.2011
  • Я не понимаю, пожалуйста, дайте еще код. Между двумя строками кода нет никакой связи, пожалуйста, скажите мне, куда поместить какую строку кода. 11.09.2011
  • @Maxner, я отредактировал свой ответ. Надеюсь, это прояснит любую путаницу. 13.09.2011

  • 2

    попробуй этот код..

    - (void)textFieldDidBeginEditing:(UITextField *)textField
    {
        UITableView *tableView;
        UITableViewCell* superViewCell = [self returnSuperCellViewOfTextField:textField];
        if(superViewCell)[tableView scrollToRowAtIndexPath:[tableView indexPathForCell:superViewCell] atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
    }
    
    -(id)returnSuperCellViewOfTextField:(id)viewToCheck
    {
        id superView = [viewToCheck superview];
        if([viewToCheck isKindOfClass:[UITableViewCell class]] && superView)return superView;
        else if(([viewToCheck respondsToSelector:@selector(superview)] && superView)) return [self returnSuperCellViewOfTextField:superView];
        return nil;
    }
    
    14.09.2011

    3

    Это (ваш ответ, который вы дали ранее ниже) все еще работает, если у вас есть несколько текстовых полей в каждой ячейке?:

    UITableViewCell *cell = (UITableViewCell *)[self.tableView viewWithTag:tagValue];
    then once you have the cell you can get the NSIndexPath like this
    
    NSIndexPath *indexPath = [self.tableView indexPathForCell:nextResponderCell];
    

    Поскольку у вас есть UITextField в пользовательской ячейке, вы можете поместить cell.textField.delegate = self; в

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

    метод источника данных. Также в этом же методе вы можете пометить оба текстовых поля ваших ячеек, например, это cell.textField.tag = indexPath.row; и такая ячейка, как эта cell.tag = indexPath.row;

    Теперь, когда вы установили делегат UITextField, вы можете поместить этот метод в свой класс UITableViewController.

    - (void)textFieldDidBeginEditing:(UITextField *)textField {
    
        CustomCell *cell = (CustomCell *)[self.tableView viewWithTag:textField.tag];
    
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
    

    У меня есть табличное представление с 8 ячейками, и в каждой ячейке у меня есть 6 текстовых полей, а также табличное представление является динамическим, поэтому пользователь может вставлять больше ячеек... но у меня проблемы с тем, как сохранить текст, который вводит пользователь. каждое текстовое поле. Возможно ли, что с «cell.textField.tag = indexPath.row» контроллер идентифицирует текстовое поле, в котором я нахожусь?

    08.08.2012

    4

    Мне нравится помечать свои ячейки так:

    /* Create a tag based on the section and row of a cell(used to retrive the cell for the beginEditingNextCell method. */
    -(NSInteger)tagForIndexPath:(NSIndexPath*)path {
        return path.section * 1000 + path.row + 1;
    }
    

    Другой способ — передать данные beginEditing с помощью пользовательского делегата и включить модель ячейки, которую затем можно использовать для определения пути в зависимости от того, как вы храните данные.

    Посмотрите мой проект на github, в нем есть код для обработки этого случая, а также изменения размера клавиатуры и перехода к следующей редактируемой ячейке: https://github.com/andrewzimmer906/XCell

    09.09.2011
  • В вашем проекте на github полный бардак, не менее 20 ошибок и предупреждений при сборке. Не могли бы вы предоставить мне еще немного кода, только что связанного с моим вопросом? У меня открыта награда 50. 11.09.2011
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..