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

Почему программисты используют configureCell: atIndexPath: метод для настройки tableView Cell

Хорошо, пока пару дней назад я не использовал код для UITableViewCell в

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

метод. Но недавно я узнал, что разработчики iPhone (или mac) используют configureCell:atIndexPath:, и даже большинство из этих ящиков, предоставленных исходным кодом, имеют это как одну из функций класса. Итак, мой вопрос в основном состоит в том, почему мы хотели создать еще одну функцию для предоставления содержимого ячейки, а затем просто написать весь код в методе cellForRowAtIndexPath:.

PS. для людей, которые не знакомы с этим, вы должны увидеть исходный код яблок. и configureCell:atIndexPath: не является другим методом в UITableViewDatasource, его просто функцией класса, которую мы имеем в каждом классе с табличным представлением. И мы используем его так.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                       reuseIdentifier:CellIdentifier] autorelease];
    }
    [self configureCell:cell atIndexPath:indexPath];
    return cell;
}

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
     cell.titleLabel.text = [NSString stringWithFormat:@"%d",indexPath.row];
}

И что более важно, после использования этого стиля для пробной цели я полюбил эту функцию, и теперь я использую ее все время. (Когда я использую UITableView)

Изменить: Хорошо. Я думаю, что люди ошибаются в моем вопросе, поэтому позвольте мне сделать это более понятным.

Я имел в виду, зачем создавать другую функцию, когда вы можете разместить весь свой код в этой функции

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

Я не беспокоюсь о имени метода.

4b9b3361

Ответ 1

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


Для исторического интереса:

Насколько я знаю, я парень, ответственный за configureCell:atIndexPath:. Я уверен, что другие люди придумали ту же идею, но я считаю, что фрагмент кода, который популяризировал его, был изначально написан мной. Затем он был распространен Apple и стал конвенцией.

Ранние версии NSFetchedResultsControllerDelegate имели метод controllerDidChangeContent:, но не вызов controllerWillChangeContent:, что означало, что не было возможности вызвать -[UITableView beginUpdates] перед изменением содержимого табличного представления.

Я подал Radar # 6708453 с просьбой добавить этот метод делегата и включил некоторый пример кода, чтобы показать им, что я хотел сделать. Этот код имел фактическую логику обновления ячеек в вызове refreshCell:atIndexPath:, так что он мог быть вызван как из tableView:cellForRowAtIndexPath:, так и controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:.

Когда появилось следующее бета-семя, я обнаружил, что команда инженеров iOS не только добавила метод, который я предлагала, но и скопировала образец кода из моего отчета об ошибке в NSFetchedResultsControllerDelegate документации, хотя они мудро изменили имя на менее запутывающее configureCell:atIndexPath:.

Я действительно начал новый проект сегодня с шаблоном основных данных iOS Core/Detail и заметил, что мой код и метод configureCell:atIndexPath: с ним - были в шаблоне. Я проверил быстрый поиск Google, чтобы узнать, стало ли это обычной конвенцией. Кажется, что это так. Я довольно горжусь тем, что этот маленький кусок кода сделал из себя!

Ответ 2

Единственный раз, когда я видел реальное преимущество, читаемость мудрая, - это когда у вас несколько типов ячеек. Тогда у вас могут быть отдельные методы, которые знают только, как заполнять этот тип ячейки, например, если у вас было 3 разных типа клеток, для собак, кошек и жирафов:

- (void)configureDogCell:(DogCell *)cell atIndexPath:(NSIndexPath *)indexPath
- (void)configureCatCell:(CatCell *)cell atIndexPath:(NSIndexPath *)indexPath
- (void)configureGiraffeCell:(GiraffeCell *)cell atIndexPath:(NSIndexPath *)indexPath

Тем не менее, я не использую этот шаблон сам. Я только что видел, как он использовался другими разработчиками в проектах, над которыми я работал.

Ответ 3

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

Ответ 4

[self configureCell:cell atIndexPath:indexPath];

просто просто сделать ваш код чистым и легким для чтения.

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath

вы можете называть это чем угодно, но большинство предпочитает называть это таким образом. Это связано с тем, что этот метод получил пропуск в объекте UITableViewCell и объекте indexPath, затем он возвращает "сконфигурированный" UITableViewCell, который затем возвращается как возвращаемый объект для

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

в другом слове, вы можете использовать

- (void)configureCellXXX:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath

и назовите его с помощью

 [self configureCellXXX:cell atIndexPath:indexPath];

и он все равно будет работать:)