迭代子视图 - 如何访问所有UI对象

Bar*_*rtu 1 iphone cocoa-touch objective-c ios

我已经为我的自定义创建了一个xib文件,UIView并将我的xib加载到我的自定义UIView中;

NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"ProductDetailView" owner:self options:nil];
self = [views objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

我不想将我的所有子视图定义为IBOutlets,所以我认为迭代子视图会更合适.

        for (id subview in self.subviews) {
            if ([subview isKindOfClass:[UIView class]]) {
                UIView *theView = (UIView*)subview;
                if (theView.tag == 16) {
                    // tag 16 is specific to some UIViews... do stuff
                }
            }
            else if ([subview isKindOfClass:[UILabel class]]) {
                UILabel *theLabel = (UILabel*)subview;

                if (theLabel.tag == 21) {
                    // tag 17 is specific to some UILabels... do stuff
                }
                else
                {
                    // no tag... do stuff 
                }

            }
        }
Run Code Online (Sandbox Code Playgroud)

我认为这会更强大,但由于UILabels继承自UIViews,我不能使用这种方法.我知道更改if命令可以使它工作,但依赖于if-clauses命令感觉不太好

我要问的是,在这种情况下最合乎逻辑的方法是什么?我应该使用viewWithTag:函数而不是循环ids和转换吗?

Jay*_*bit 5

你可以用IBOutletCollection.您创建一个数组UILabels和一个数组UIViews

 @property (strong, nonatomic) IBOutletCollection(UILabel) NSArray *labels;
 @property (strong, nonatomic) IBOutletCollection(UIView) NSArray *views;
Run Code Online (Sandbox Code Playgroud)

所有你要做的就是创建@property上面的内容,并在IB中连接你想要分组到这个集合的所有标签,就像你对IBOutlet一样.你想要迭代它们的时候:

for (UILabel *label in self.labels) {
     NSLog(@"labelTag:%i", label.tag);
     // Do what you want with this label
}

for (UIView *view in self.views) {
     NSLog(@"viewTag:%i", view.tag);
     // Do what you want with this view
}
Run Code Online (Sandbox Code Playgroud)