代码之家  ›  专栏  ›  技术社区  ›  Andrew Ebling

测试IBOutlets是否自动连接或在未连接的插座上建立故障

  •  2
  • Andrew Ebling  · 技术社区  · 11 年前

    有没有人找到一种方法来自动对定义为 IBOutlets UIViewController 子类在加载视图后连接(通过调用 loadView )?

    我的理解是 IBOutlet 是预处理的,因此您无法确定哪些属性是 IB插座 在运行时。

    或者,如果您定义了 IB插座 哪些没有连接?可能是LLVM编译器警告选项?

    1 回复  |  直到 11 年前
        1
  •  2
  •   Paul.s    11 年前

    你可以使用一个断言,这会让你很快地失败(引起你的注意)。

    - (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);
    }