Почему программисты используют 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
Я не беспокоюсь о имени метода.
Ответы
Ответ 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];
и он все равно будет работать:)