Динамически перечислять IBOutlets класса - PullRequest
1 голос
/ 06 июля 2011

Я работал с этим

objc_property_t *properties = class_copyPropertyList([NSString class], &outCount);

с двумя ограничениями, которые я не знаю, как решить:

  1. Не перечисляются унаследованные свойства.
  2. Я не могу отличить IBOutlets от других свойств.

Как я могу динамически перечислить все свойства IBOutlet в классе (или экземпляре)?

Ответы [ 2 ]

3 голосов
/ 06 июля 2011

IBOutlet - #define d в виде пустой строки ; это не имеет никакого эффекта ни во время компиляции, ни во время выполнения. Его единственная цель - позволить Интерфейсному Разработчику просматривать файлы заголовков и видеть, какие ivars следует использовать в качестве соединений. Единственный способ определить, какие ивары были объявлены как IBOutlet s, - это также выполнить некоторую текстовую обработку файла заголовка любого класса, с которым вы работаете.

Что касается свойств, я не уверен, что есть другой способ, кроме как подняться по списку суперклассов и получить все их свойства. Вы можете вызвать class_getSuperclass в цикле, чтобы получить всю родословную вашего класса; * функция возвращает Nil, когда вы вызываете ее с корневым классом (NSObject) в качестве аргумента.


* См., Например, этот SO-ответ моего.

0 голосов
/ 06 июля 2011

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

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