我需要获取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 :(得分: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。或者添加一个关联参考。
但是尝试使用变量名称并不是最好的解决方案,你想要完成什么?