gpt4 book ai didi

objective-c - 如何在运行时以编程方式检测属性是否为 IBOutlet?

转载 作者:太空狗 更新时间:2023-10-30 03:53:55 25 4
gpt4 key购买 nike

我正在对我的项目设置单元测试,以确保所有 UIViewController IBOutlet 都连接到它们各自的 Xib 对象(即,在 viewDidLoad 之后不为零。)我正在考虑将协议(protocol)应用于这些具有所需功能的 UIViewControllers“getAllOutletNames”,像这样:

-(NSArray*)getAllOutletNames
{
return @[ @"outletproperty1", @"outletProperty2", ...];
}

...然后使用 [viewController valueForKey:outletName] 来确保这些都不是 nil。这样做的问题是它有点笨拙。必须为添加到 xib 的每个导出更新“getAllOutletNames”,这很容易被忽视。我更愿意以编程方式执行此操作,以便可以自动检测和迭代所有 IBOutlet 属性。

我读入了this NSHipster article (cmd+f 用于“属性支持的属性”)一个属性应用于 IBOutlets(或者,一个“属性支持的属性”,我不太明白。)

看起来我可以使用 this answer 的一部分获得类中所有属性的列表,我可以使用 this answer 的一部分获取它们的属性.但是,使用以下代码打印出 IBOutlet 属性与非 IBOutlet 属性的属性,我没有发现任何区别:

const char * type = property_getAttributes(class_getProperty([self class], [outletName UTF8String]));
NSString * typeString = [NSString stringWithUTF8String:type];
NSArray * attributes = [typeString componentsSeparatedByString:@","];
NSLog(@"%@",attributes);

IB 导出

(
"T@\"UILabel\"",
"&",
N,
"V_titleLabel"
)

非IBOutlet

(
"T@\"UIView\"",
"&",
N,
"V_programmaticallySetupView"
)

有没有什么方法可以访问 NSHipster 文章提到的这个“属性支持的属性”,或者以其他方式以编程方式确定属性是否为 IBOutlet,或者我在这里找错树了吗?

最佳答案

这是我以前用来将方法标记为特殊的技巧,它也可以用于属性:

#import <objc/runtime.h>

#define synthesize_nooutlet(name) \
synthesize name=_ ## name; \
- (oneway id)name { \
return _ ## name; \
}

@interface ViewController ()

@property (nonatomic, strong) UIView *theView;

@end

@implementation ViewController

@synthesize_nooutlet(theView);

- (void) viewDidLoad {

[super viewDidLoad];

[self.theView setBackgroundColor:[UIColor clearColor]];

char returnType;
method_getReturnType(class_getInstanceMethod([self class], @selector(theView)), &returnType, 1);
if (returnType == 'V') {
// Do stuff
}
}

@end

这是因为分布式对象类型编码,记录在这里:

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html#//apple_ref/doc/uid/TP40008048-CH100-BABHAIFA

您可以根据需要使用其中任何一个来表示方法,并且由于 iOS 上不存在分布式对象,编译器和运行时会忽略它们。

关于objective-c - 如何在运行时以编程方式检测属性是否为 IBOutlet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30852109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com