2

IBOutletsサブクラスで定義されたすべてのプロパティUIViewControllerがビューがロードされた後に接続されていることを自動的に単体テストする方法を考え出した人はいloadViewますか?

私の理解では、それは前処理されているため、実行時にIBOutletどのプロパティであるかを判断する能力が失われます。IBOutlets

または、接続されていないものを定義した場合、ビルドを強制的に失敗させる別の方法はありIBOutletsますか? おそらくLLVMコンパイラの警告オプション?

4

1 に答える 1

2

激しく素早く失敗する (注意を引く) ことを可能にする assert を使用できます。

- (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);
}
于 2013-04-03T11:45:40.487 に答える