2

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

4 回答 4

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属性来跟踪您的视图。或者,如果你坚持通过字符串来做这件事,你总是可以子类化你的元素并给它们一个 NSStringname属性。这样做,您可以将这些值硬编码为等同于您分配给对象的指针名称的字符串值。

于 2013-11-07T12:20:23.463 回答
1

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

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

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

所以答案是:即使在一定程度上在 Objective-C 中是可能的,也不要这样做。改变你的设计,而不是依赖这些信息。

于 2013-11-07T12:30:17.853 回答
1

这个任务不是很清楚。

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

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

树扫描可以通过递归函数来实现。如何找到所有 UIView?

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

属性扫描可以通过以下主题中描述的反射来实现

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

于 2013-11-07T12:31:58.157 回答
1

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

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

于 2013-11-07T12:32:46.340 回答