1

カスタム用の xib ファイルを作成し、xib をカスタムUIViewにロードUIViewしました。

NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"ProductDetailView" owner:self options:nil];
self = [views objectAtIndex:0];

すべてのサブビューを 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 
                }

            }
        }

これはより堅牢だと思っていましたが、UILabels は s から継承されているUIViewため、このアプローチは使用できません。if 命令を変更すると機能することは承知していますが、if 句の順序に依存するのはあまり気分が良くありません

私が求めているのは、そのような状況で最も論理的なアプローチは何でしょうか? viewWithTag:sをループしてidキャストする代わりに、関数を使用する必要がありますか?

4

2 に答える 2

5

使用できますIBOutletCollectionUILabelsの配列との配列を作成しますUIViews

 @property (strong, nonatomic) IBOutletCollection(UILabel) NSArray *labels;
 @property (strong, nonatomic) IBOutletCollection(UIView) NSArray *views;

これを使用するには、@property上記を作成し、IBOutlet の場合と同様に、グループ化するすべてのラベルを IB でこのコレクションに接続するだけです。それらを反復したい場合:

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
}
于 2013-02-08T13:21:35.587 に答える
3

オブジェクトの特定のタイプをテストする場合は、オブジェクトが指定されたクラスのものであるか、または指定されたクラスから継承されているかをテストするisMemberOfClassではなくを使用します。isKindOfClass

于 2013-02-08T13:22:27.007 に答える