2013-11-07 3 views
0

мне нужно получить имя объекта для UILabel, UITextView и т.д. Например:Как получить строковое имя объекта?

@property (nonatomic, strong) IBOutlet UITextField *Adress; 

...

for (UIView *theObject in [self.view subviews]){ 
    NSString *objName = //theObject name 
    NSLog(@"name of subview is: %@", objName); 
    // should be "name of subview is: Adress " 
} 

Кто-нибудь есть какие-нибудь идеи?

+0

какое имя вы говорите о названии класса или имени IBUTlet –

+0

, почему вы хотели бы иметь название выхода? Вы можете пометить его и установить произвольное имя. – Mikael

+2

Пожалуйста, старайтесь придерживаться условных обозначений Objective-C. Запуск имен переменных с прописными буквами («Адрес») не является хорошей идеей, так как по соглашению константы и имена классов начинаются с символов верхнего регистра. – DarkDust

ответ

2

Вы не можете получить имя, присвоенное указателю во время выполнения. Однако, если вы заинтересованы в получении класс объекта, то есть более выполнимо ..

for (UIView *view in self.view.subviews) { 
    NSString *className = NSStringFromClass([view class]); 
    NSLog(@"the name of the class of the current object is: %@",className); 
} 

Если вы действительно хотите, чтобы иметь возможность ссылаться на объект, как это, я предлагаю вам вместо использования UIView-х tag чтобы отслеживать ваши взгляды. Или, если вы настаиваете на выполнении этой строки, вы всегда можете подклассифицировать свои элементы и предоставить им свойство NSString name. При этом вы можете просто скопировать эти значения в эквивалент строкового значения имени указателя, назначенного этому объекту.

+0

Спасибо, но получить имя класса не интересно для меня. Мне нужно просто имя объекта. – Alex

+0

@Alex Извините, но посмотрите, что я добавил в свой пост, это единственная работа-раунд для этого, о которой я знаю. –

1

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

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

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

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

1

Эта задача не совсем понятна.

Прежде всего, вы должны понимать, что один объект может передаваться из нескольких свойств.

Кстати, вы можете попробовать сканировать дерево просмотра и список всех ViewControllers и искать все свойства, относящиеся к этому объекту.

Сканирование дерева может быть реализовано с помощью рекурсивной функции. How to find all UIViews?

список ViewController сканирование может быть реализовано с помощью How to get all view controllers?

сканирования свойств может быть реализован с помощью отражения, который описан в следующем topic

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

1

Вы можете подклассифицировать класс UI и добавить к нему поле имени, а затем установить это имя во время инициализации. Или используйте значение тега и некоторый метод поиска, например NSDictionary. Или добавьте ассоциативную ссылку.

Но попытка использования имени переменной - не лучшее решение, Что вы пытаетесь выполнить?

Смежные вопросы