1

我有一个关于 iOS 编程的问题。

我正在尝试从主 UIView 和子视图属性中获取所有子视图。我正在使用委托"- (void)listSubviewsOfView:(UIView *)view",但此方法返回描述不佳的子视图信息。

例如:

 - "UIImageView: 0x1d557250; frame = (10 6.5; 32 32); opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = CALayer: 0x1d557220",
 - "UILabel: 0x1d557190; frame = (50 0; 240 43); text = '11:00'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = CALayer: 0x1d557960",

-“UIView:0x1d5568e0;帧=(110 10;190 23);层=CALayer:0x1d5568b0”,

但我想获取例如 UILabel 文本颜色、字体大小和其他信息。是否有某种方法或对象可以帮助我获取这些信息?

4

2 回答 2

1
#import <objc/runtime.h>

- (void)yourMethod{
    UIView *parnetView = ...;

    [parentView.subviews makeObjectsPerformSelector:@selector(printAllProperties)];
}

@interface UIView (printAllProperties)
- (void) printAllProperties;
@end

@implementation UIView (printAllProperties)

-(void)printAllProperties{
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        unsigned int numberOfProperties = 0;
        objc_property_t *propertyArray = class_copyPropertyList([self class], &numberOfProperties);
        for (NSUInteger i = 0; i < numberOfProperties; i++) {
            objc_property_t property = propertyArray[i];
            NSString *name = [[NSString alloc] initWithUTF8String:property_getName(property)];
            NSLog(@"Property %@ Value: %@", name, [self valueForKey:name]);
        }
        free(propertyArray);
    });    
}
@end

您需要将方法printAllProperties作为类别添加到 UIView

于 2013-08-28T08:46:13.460 回答
0

AFAIK 在 UIKit 中没有可用的方法可以为您做到这一点。您必须查询运行时系统才能获取此信息。有关更多详细信息,请参阅此答案(如果您觉得有用,请在链接中投票)。

要了解 ObjC 运行时,请阅读Objective-C 运行时编程指南Objective-C 运行时参考

希望有帮助!

于 2013-08-28T07:49:27.420 回答