我怎样才能获得对象的字符串名称?

时间:2013-11-07 12:15:53

标签: ios objective-c

我需要获取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  "
}

有人有什么想法吗?

4 个答案:

答案 0 :(得分: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属性。这样做,您可以将这些值硬编码为等于您指定给对象的指针名称的字符串值。

答案 1 :(得分:1)

你无法获得指向你的对象的变量的名称(好吧,你可以,但见下文)。

这有点像普通的街道地址:如果你有一个邮件信封(变量),你可以看到它指向的地址,但你怎么能找到指向同一地址的所有信封?您需要收集所有信封并扫描所有信封或添加某种跟踪。

在Objective-C中,有一种方法可以遍历对象的所有实例变量,并检查它们是否指向您的对象。但这是非常低的水平和完全反模式。此外,您需要知道要枚举其实例变量的对象。

所以回答是:即使在某种程度上在Objective-C中是可能的,也不要这样做。更改您的设计,而不是依赖此信息。

答案 2 :(得分:1)

这项任务不太清楚。

首先,您应该了解一个对象可能会从多个属性中引用。

顺便说一下,您可以尝试扫描所有ViewControllers的视图树和列表,并查找引用此对象的所有属性。

树扫描可以通过递归函数实现。 How to find all UIViews?

ViewController列表扫描可以通过How to get all view controllers?

实现

属性扫描可以通过以下topic

中描述的反射来实现

您可以尝试扫描对象的所有引用并扫描其属性。但是,我没有看到任何关于该任务的快速指南。

答案 3 :(得分:1)

您可以为UI类创建子类并为其添加名称字段,然后在初始化时设置该名称。或者使用标记值和一些查找方法,例如NSDictionary。或者添加一个关联参考。

但是尝试使用变量名称并不是最好的解决方案,你想要完成什么