IBOutlets
有没有人想出一种方法来自动对定义为UIViewController
子类的所有属性进行单元测试,在加载视图后(通过调用loadView
)连接?
我的理解是,这IBOutlet
是预先处理的,所以你失去了IBOutlets
在运行时计算出哪些属性的能力。
IBOutlets
或者,如果您定义了哪些未连接,是否还有另一种方法可以强制构建失败?可能是 LLVM 编译器警告选项?
IBOutlets
有没有人想出一种方法来自动对定义为UIViewController
子类的所有属性进行单元测试,在加载视图后(通过调用loadView
)连接?
我的理解是,这IBOutlet
是预先处理的,所以你失去了IBOutlets
在运行时计算出哪些属性的能力。
IBOutlets
或者,如果您定义了哪些未连接,是否还有另一种方法可以强制构建失败?可能是 LLVM 编译器警告选项?
你可以使用一个断言,它可以让你快速失败(引起你的注意)。
- (void)viewDidLoad
{
[super viewDidLoad];
NSAssert(self.myLabel, @"IBOutlet not set for self.myLabel");
}
您可能可以将其包装在一个宏中以节省一些输入 - 可能是这样的
#define PASOutletAssert(outlet) NSAssert(outlet, @"IBOutlet not set for " @#outlet)
- (void)viewDidLoad
{
[super viewDidLoad];
PASOutletAssert(self.myLabel);
PASOutletAssert(self.myOtherLabel);
}
节省一些打字的另一种变体可能如下所示 -
#define PASOutletsAssert(self, ...) _PASOutletsAssert(self, @"" # __VA_ARGS__)
void _PASOutletsAssert(id self, NSString *commaSeperatedKeyPaths)
{
NSArray *keyPaths = [commaSeperatedKeyPaths componentsSeparatedByString:@", "];
for (NSString *keyPath in keyPaths) {
NSCAssert1([self valueForKeyPath:keyPath], @"IBOutlet not set for keypath - \"%@\"", keyPath);
}
}
- (void)viewDidLoad
{
[super viewDidLoad];
PASOutletsAssert(self, myLabel, otherLabel, yellowSquare);
}