Зачем использовать "viewWithTag" с "dequeueReusableCellWithIdentifier"? - PullRequest
12 голосов
/ 03 сентября 2010

Может кто-нибудь объяснить, почему вы должны использовать viewWithTag для получения подпредставлений (например, UILabel и т. Д.) Из ячейки dequeueReusableCellWithIdentifier?

Некоторая справочная информация: у меня есть пользовательский UITableViewCell с парой UILabel с (я воспроизвел простую версию этого ниже).Эти метки определены в связанном файле NIB и объявлены с IBOutlet s и связаны с классом контроллера пользовательской ячейки.В табличном представлении dequeueReusableCellWithIdentifier я делаю это:

CustomCell *customCell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"CustomCellId"];
if (customCell == nil) {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"customCell" owner:self options:nil];
    for (id oneObject in nib)
        if ([oneObject isKindOfClass:[CustomCell class]])
            customCell = (CustomCell *)oneObject;
}

customCell.firstLabel.text = @"Hello";
customCell.secondLabel.text = @"World!";

return customCell;

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

UILabel *firstLabel = (UILabel *)[customCell.contentView viewWithTag:555];
firstLabel.text = @"Hello";

UILabel *secondLabel = (UILabel *)[customCell.contentView viewWithTag:556];
secondLabel.text = @"World!";

(значения меток меток были установлены в NIB).

Может кто-нибудь сказать мне, какой метод предпочтительнее и почему?

Спасибо!

Ответы [ 6 ]

13 голосов
/ 03 сентября 2010

viewWithTag: - это просто быстрый и грязный способ извлечения дочерних представлений без необходимости настройки свойств IBOutlet для родительского объекта или даже без создания подкласса UITableViewCell.

Для очень простых случаев это приемлемое решение, для этого и было предназначено viewWithTag:. Однако, если вы собираетесь многократно использовать эту ячейку или хотите, чтобы у нее был более удобный для разработчиков интерфейс, тогда вы захотите создать подкласс и использовать реальные свойства, как в первом примере.

Поэтому используйте viewWithTag:, если это очень простая ячейка, которую вы разработали в IB без подкласса и всего с парой меток. Используйте подкласс ячейки с реальными свойствами для чего-то более существенного.

10 голосов
/ 08 сентября 2010

Я понял, что полезно извлекать элементы, используя «viewWithTag», если элементы были добавлены в ячейку программно (т.е. не определены в NIB и подключены через IBOutlets) - это предотвращает создание нескольких меток и т. Д.для каждого экземпляра ячейки.

4 голосов
/ 06 июня 2012

Для меня viewWithTag - это Бог. Прежде всего: обрабатывать все представления в цикле, как сказал Taskinoor, действительно легко. Кроме того, я лично предпочитаю этот способ, потому что, если я взгляну на код и захочу посмотреть, что происходит с представлением, я просто ищу тег. Он используется везде, где обрабатывается представление. В противоположность подходу xib, где вы должны искать код и xib тоже. Кроме того, если у вас есть внеэкранный вид в xib, вы можете наблюдать за ним. Я нашел много xibs, сделанных другими программистами, которые были ПОЛНЫ с большим и большим количеством просмотров. Некоторые скрытые, некоторые за кадром, не могли сказать, что есть, поскольку все они перекрывались. В этих случаях я думаю, что XIBS плохие. Их не легко читать больше. Я предпочитаю все, что сделано в коде.

Но если вы решили работать с тегами, не забудьте жестко кодировать любой тег. Вместо этого создайте список определений #define, чтобы код был чистым и читабельным.

1 голос
/ 03 сентября 2010

Я всегда подключаю подпредставления к свойствам моего подкласса UITableViewCell через IBOutlets, как вы сделали.Я не могу придумать вескую причину использовать viewWithTag.

0 голосов
/ 06 апреля 2016

viewWithTag: позволяет стилизовать без создания собственного подкласса из UITableViewCell.

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

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

0 голосов
/ 22 сентября 2013

Из ссылки на класс UITableViewCell: «Делегат табличного представления в tableView: cellForRowAtIndexPath: должен всегда сбрасывать все содержимое при повторном использовании ячейки».Сохраняйте это простым, очистите представление контента.Это не делает никаких предположений относительно пользовательских классов ячеек, ни приведений, ни проверок классов:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (cell != nil)
{
    NSArray* contentSubViews = [cell.contentView subviews];
    for (UIView* viewToRemove in contentSubViews)
    {
        [viewToRemove removeFromSuperview];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...