成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

IBOutletCollection

移動開發 iOS
在IB與相關文件做連接時,我們經常會用到兩個關鍵字:IBOutlet和IBAction。經常用xib或storyboard的童鞋應該用這兩上關鍵字非常熟悉了。不過UIKit還提供了另一個偽關鍵字IBOutletCollection,我們使用這個關鍵字,可以將界面上一組相同的控件連接到同一個數組中

IBOutletCollection

在IB與相關文件做連接時,我們經常會用到兩個關鍵字:IBOutlet和IBAction。經常用xib或storyboard的童鞋應該用這兩上關鍵字非常熟悉了。不過UIKit還提供了另一個偽關鍵字IBOutletCollection,我們使用這個關鍵字,可以將界面上一組相同的控件連接到同一個數組中

我們先來看看這個偽關鍵字的定義,可以從UIKit.framework的頭文件UINibDeclarations.h找到如下定義:

  1. #ifndef IBOutletCollection 
  2. #define IBOutletCollection(ClassName) 
  3. #endif 

另外,在Clang源碼中,有更安全的定義方式,如下所示:

  1. #define IBOutletCollection(ClassName) __attribute__((iboutletcollection(ClassName))) 

從上面的定義可以看到,與IBOutlet不同的是,IBOutletCollection帶有一個參數,該參數是一個類名。

通常情況下,我們使用一個IBOutletCollection屬性時,屬性必須是strong的,且類型是NSArray,如下所示:

  1. @property (strong, nonatomic) IBOutletCollection(UIScrollView) NSArray *scrollViews; 

假定我們的xib文件中有三個橫向的scrollView,我們便可以將這三個scrollView都連接至scrollViews屬性,然后在我們的代碼中便可以做一些統一處理,如下所示:

  1. - (void)setupScrollViewImages 
  2. for (UIScrollView *scrollView in self.scrollViews) { 
  3. [self.imagesData enumerateObjectsUsingBlock:^(NSString *imageName, NSUInteger idx, BOOL *stop) { 
  4. UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(CGRectGetWidth(scrollView.frame) * idx, 0, CGRectGetWidth(scrollView.frame), CGRectGetHeight(scrollView.frame))]; 
  5. imageView.contentMode = UIViewContentModeScaleAspectFill; 
  6. imageView.image = [UIImage imageNamed:imageName]; 
  7. [scrollView addSubview:imageView]; 
  8. }]; 

這段代碼會影響到三個scrollView。這樣做的好處是我們不需要手動通過addObject:方法將scrollView添加到scrollViews中。

不過在使用IBOutletCollection時,需要注意兩點:

IBOutletCollection集合中對象的順序是不確定的。我們通過調試方法可以看到集合中對象的順序跟我們連接的順序是一樣的。但是這個順序可能會因為不同版本的Xcode而有所不同。所以我們不應該試圖在代碼中去假定這種順序。

不管IBOutletCollection(ClassName)中的控件是什么,屬性的類型始終是NSArray。實際上,我們可以聲明是任何類型,如NSSet,NSMutableArray,甚至可以是UIColor,但不管我們在此設置的是什么類,IBOutletCollection屬性總是指向一個NSArray數組。

關于第二點,我們以上面的scrollViews為例,作如下修改:

  1. @property (strong, nonatomic) IBOutletCollection(UIScrollView) NSSet *scrollViews; 

實際上我們在控制臺打印這個scrollViews時,結果如下所示:

  1. (lldb) po self.scrollViews 
  2. <__NSArrayI 0x1740573d0>( 
  3. <UIScrollView: 0x12d60d770; frame = (0 0320 162); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x1740574f0>; layer = <CALayer: 0x174229480>; contentOffset: {00}; contentSize: {00}>, 
  4. <UIScrollView: 0x12d60dee0; frame = (0 0320 161); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x174057790>; layer = <CALayer: 0x1742297c0>; contentOffset: {00}; contentSize: {00}>, 
  5. <UIScrollView: 0x12d60e650; frame = (0 0320 163); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x1740579a0>; layer = <CALayer: 0x1742298e0>; contentOffset: {00}; contentSize: {00}> 

可以看到,它指向的是一個NSArray數組。

另外,IBOutletCollection實際上在iOS 4版本中就有了。不過,現在的Objective-C已經支持object literals了,所以定義數組可以直接用@[],方便了許多。而且object literals方式可以添加不在xib中的用代碼定義的視圖,所以顯得更加靈活。當然,兩種方式選擇哪一種,就看我們自己的實際需要和喜好了。

參考

IBAction / IBOutlet / IBOutlet​Collection

IBOutletCollection.m

 

責任編輯:chenqingxiang 來源: 南峰子的技術博客
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产91网站在线观看 | 亚洲网站在线 | 亚洲综合视频 | 天堂一区| 五月激情婷婷网 | 色爱区综合 | 日韩精品一区二区三区在线播放 | 亚洲激情综合网 | 中文字幕 亚洲一区 | 中文字幕影院 | 成人免费三级电影 | 在线区| 国产成人福利在线 | 人人看人人射 | 欧美日韩精品专区 | 精品国产一区二区三区久久久蜜月 | 精品欧美乱码久久久久久1区2区 | 久久亚洲一区 | 亚洲美女网站 | 欧美精品久久久 | 欧美日韩亚洲一区 | 伊人无码高清 | 91高清免费 | 国产精品美女久久久久aⅴ国产馆 | 国产成人精品一区二区三区四区 | 性欧美xxxx | 日韩欧美三级 | 国产伦精品一区二区三区精品视频 | 国产精品毛片一区二区在线看 | 亚洲一区二区三区 | 91成人午夜性a一级毛片 | 天堂va在线观看 | 精品久久久久久亚洲综合网 | 草久久久| 国产欧美在线播放 | xx性欧美肥妇精品久久久久久 | 欧美精品成人影院 | 99tv| aa级毛片毛片免费观看久 | 最近最新中文字幕 | 欧美成人精品激情在线观看 |