2010-09-03 3 views
12

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

Некоторые справочные данные: У меня есть пользовательский номер UITableViewCell с паролем UILabel (в нем приведена простая версия ниже). Эти метки определены в ассоциированном файле NIB и объявлены с помощью IBOutlet s и связаны с классом контроллера пользовательской ячейки. В TableView-х 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!"; 

(наклеек значения тегов были установлены в СИБ).

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

Спасибо!

ответ

10

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

+1

Обычно вы используете подкласс UITableViewCell над быстрым и грязным методом viewWithTag. –

1

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

13

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

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

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

4

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

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

0

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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId]; 
if (cell != nil) 
{ 
    NSArray* contentSubViews = [cell.contentView subviews]; 
    for (UIView* viewToRemove in contentSubViews) 
    { 
     [viewToRemove removeFromSuperview]; 
    } 
} 
0

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

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

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