Вы помечаете свои UIViews или сохраняете их как свойства? - PullRequest
15 голосов
/ 29 января 2009

Это в основном стилистический вопрос, но мне было любопытно, что думают другие, так как я начал программировать для iPhone. Если у вас есть приложение UIView в приложении iPhone, и вам нужно получить к нему доступ в другом месте приложения (как правило, в другой функции в контроллере представления), вы хотите пометить представление целым числом и получить его с помощью сообщения viewWithTag:, или вы обычно устанавливаете это свойство в контроллере представления для более легкого доступа позже?

Сохранение его как свойства, очевидно, облегчает его извлечение позже, но я думаю, что существует некоторый (возможно незначительный) объем памяти, который сохраняется путем пометки представления вместо установки его в качестве свойства объекта.

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

Ответы [ 6 ]

10 голосов
/ 30 января 2009

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

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

Я всегда использую переменные экземпляра IBOutlet и иногда добавляю теги к элементам управления, где мне не нужно ничего делать, кроме как сказать, какой именно элемент управления вызвал метод делегата, который может быть активирован несколькими различными элементами управления. Это немного менее эффективно, но код легче поддерживать в этом случае.

6 голосов
/ 28 февраля 2010

Я понимаю, что это может иметь отношение к вопросу ОП, но это может быть полезно для подачи в Google.

Одно использование, которое я нашел для тегирования UIView, на самом деле заключается не в том, чтобы найти представление по тегу в иерархии представлений (которое, как упоминалось выше, может стать довольно дорогим), а в различении двух или несколько представлений друг от друга делегатом, назначенным для обработки нескольких из них, чтобы избежать множества назначений свойств (что, безусловно, может сделать код UIViewController более тесно связанным).

Классическим случаем этого является UITableViewController, делегат UITableViewDataSource которого был выведен в отдельный класс. Скажем, UITableViewController позже хочет добавить панель поиска и хочет использовать тот же UITableViewDataSource. Это означает, что будут вызваны методы UITableViewDataSource, и источник данных должен будет часто отличать реальный UITableView от searchResultsTableView на UISearchDisplayController. Если UITableViewController устанавливает тег для каждого из представлений таблицы, то источник данных может легко переходить по поведению на основе значения тега и без необходимости ссылаться на представления таблицы или (что еще хуже) контроллера отображения поиска.

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

6 голосов
/ 30 января 2009

Я использую свойства. Влияние памяти совсем не является проблемой для размышлений. viewWithTag: может также потреблять немного ресурсов процессора для использования, но главная причина, по которой я это делаю, это более чистый код, который получается. Доступ к self.leftSideView гораздо приятнее, чем [self.view viewWithTag: LEFTSIDEVIEW], и ​​вам не нужно управлять перечислением, чтобы знать, что происходит.

Я считаю теги полезными для отладки, но не для повседневного использования.

3 голосов
/ 19 марта 2011

Я опаздываю к этому обсуждению, но думаю, что стоит расширить точку зрения Джастина Сирлса об использовании тегов для различения видов, в частности элементов управления. Иногда вам нужна группа кнопок, которые все делают одно и то же, но представляют разные значения. Хороший пример - кнопки на калькуляторе: все кнопки или, по крайней мере, все числовые, будут связаны с одной и той же целью и действием. Хотя у цели может быть выход для каждой кнопки, а действие может сравнивать адрес отправителя с каждым выходом по очереди, гораздо проще назначить каждой кнопке идентификатор, который помогает действию различать, какая кнопка была нажата. Здесь теги наиболее полезны.

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

3 голосов
/ 04 июня 2009

Просто повторяя сказанное Кендаллом, viewWithTag: это дорого. У меня был цикл из нескольких сотен звонков, и цикл мог занять более 2 секунд. Переключился на массив, и теперь я даже не замечаю, что цикл работает.

3 голосов
/ 29 января 2009

Я всегда связываю их с помощью Interface Builder для IBOutlet ivars

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...