Вы помечаете свои UIViews или сохраняете их как свойства?
Это в основном стилистический вопрос, но мне было любопытно, что думают другие, с тех пор как я начал программировать для iPhone. Когда у вас есть UIView в приложении iPhone, и вам нужно получить к нему доступ в другом месте приложения (как правило, в другой функции в контроллере представления), вы хотите пометить представление целым числом и получить его с сообщением viewWithTag:
или вы обычно устанавливаете его для свойства в контроллере представления для более легкого доступа позже?
Сохранение его как свойства, очевидно, облегчает его получение позже, но я думаю, что есть некоторый (возможно, незначительный) объем памяти, который сохраняется путем пометки представления вместо того, чтобы устанавливать его как свойство объекта.
Я вообще создавал свойства на своих контроллерах представления, главным образом потому, что я ленив, а получение представлений с помощью viewWithTag:
вызывает раздражение.
Ответы
Ответ 1
Память не сохраняется, не используя свойства - свойство генерирует только небольшой бит кода, который ссылается на переменную экземпляра, указывающую на ваш вид, который будет сохранен, если вы укажете на него или нет.
Использование viewWithTag всегда будет более дорогостоящим и медленным, поскольку этот вызов должен проходить через иерархию представлений, запрашивая каждое представление, что такое значение тега.
Я всегда использую переменные экземпляра IBOutlet и иногда добавляю теги к элементам управления, где мне не нужно ничего делать, кроме как указать, какой конкретный элемент управления называется методом делегата, который может быть активирован несколькими различными элементами управления. Это немного менее эффективно, но в этом случае код легче поддерживать.
Ответ 2
Я использую свойства. Влияние памяти не является проблемой, о которой нужно подумать. viewWithTag: может также записать небольшой процессор для использования, но главная причина, по которой я это делаю, - это получить более чистый код. Намного лучше получить доступ к self.leftSideView, чем [self.view viewWithTag: LEFTSIDEVIEW], и вам не нужно управлять перечислением, чтобы узнать, что происходит.
Я считаю теги полезными для отладки, но не для ежедневного использования.
Ответ 3
Я понимаю, что это может быть касательно вопроса OP, но это может быть полезно для кормления Google.
Одно использование, которое я нашел для тегов UIView, на самом деле не для того, чтобы найти представление по тегу в иерархии представлений (которое, как указано выше, может стать довольно дорогостоящим), а скорее для того, чтобы различать два или несколько просмотров друг от друга делегатом, которому поручено обрабатывать несколько из них, как способ избежать тонны присвоений свойств (что, безусловно, может сделать код UIViewController более тесно связан).
Классическим примером этого является UITableViewController, чей UITableViewDataSource делегирован для отдельного класса. Скажем, UITableViewController позже хочет добавить строку поиска и хочет использовать тот же UITableViewDataSource. Это означает, что будут вызываться методы UITableViewDataSource, и источнику данных необходимо будет часто различать реальный UITableView из searchResultsTableView в UISearchDisplayController. Если UITableViewController установил тег в каждом представлении таблицы, тогда источник данных мог бы легко разветвлять поведение на основе значения тега и без необходимости ссылаться на представления таблиц или (что еще хуже) на контроллер отображения поиска.
Опять же, я понимаю, что это было не совсем дерево, на которое обманывал аскер, но это единственный случай использования, который мне действительно нравится в использовании тегов.
Ответ 4
Я всегда связываю их с конструктором интерфейса IBOutlet
ivars
Ответ 5
Просто повторив то, что сказал Кендалл, viewWithTag: это дорого. У меня был цикл из нескольких сотен вызовов, и цикл должен был выполнять 2+ секунды. Переключился на массив, и теперь я даже не замечаю, что цикл работает.
Ответ 6
Я опаздываю на это обсуждение, но я думаю, что стоит упомянуть точку Justin Searls об использовании тегов для различения видов, в частности элементов управления. Иногда вам нужна группа кнопок, которые все делают по существу одно и то же, но представляют разные значения. Кнопки калькулятора являются хорошим примером: все кнопки или, по крайней мере, все числовые, будут подключены к одной и той же цели и действию. Хотя у мишени может быть выход для каждой кнопки, и действие может поочередно сравнивать адрес отправителя с каждой розеткой, гораздо проще дать каждой кнопке идентификатор, который помогает действовать, какую кнопку нажата. Вот где теги наиболее полезны.
Если диспетчеру просмотра потребуется ссылка на представление, чтобы настроить его или иным образом отправить ему сообщения, обычно имеет смысл использовать розетку. Если ему просто нужен способ рассказать один взгляд из другого, теги являются хорошим выбором.