0

次のような名前のボタンがたくさんあります。

@property (weak, nonatomic) IBOutlet UIButton *Round1Num1;
@property (weak, nonatomic) IBOutlet UIButton *Round1Num2;
@property (weak, nonatomic) IBOutlet UIButton *Round1Num3;
@property (weak, nonatomic) IBOutlet UIButton *Round1Num4;

@property (weak, nonatomic) IBOutlet UIButton *Round2Num1;
@property (weak, nonatomic) IBOutlet UIButton *Round2Num2;
@property (weak, nonatomic) IBOutlet UIButton *Round2Num3;
@property (weak, nonatomic) IBOutlet UIButton *Round2Num4;

等々。

stringWithFormatまたは同様の方法を使用して動的にアクセスできるかどうか疑問に思っていました。

例 (コードが間違っていたらごめんなさい!):

self.Round1Num1私が電話する代わりにself.[NSString stringWithFormat:@"Round%dNum%d", 1, 1]

4

1 に答える 1

1

使用できます-performSelector:

NSString *round2Num1ButtonAccessorSelectorStr = [NSString stringWithFormat:@"Round%dNum%d", 2, 1];
SEL selector = NSSelectorFromString(round2Num1ButtonAccessorSelectorStr);
if ([self respondsToSelector:selector])
    UIButton *round2Num1Button = [self performSelector:selector];

コンテキストでは、[self performSelector:@selector(someSelector)]は本質的にself.someSelectorに解決される (プロパティ アクセサーの場合) と同等[self someSelector]です。すべてのケースで、実際には同じランタイム関数が呼び出されますobjc_msgSend(self, someSelector)

具体的には、このコンテキストでは、VC インスタンスのそれぞれの IBOutlet プロパティによって隠蔽された同じ参照を指すローカル変数を作成しています。プロパティが存在しない場合、セレクターも存在しない可能性が高いため (ほとんどの場合)、認識されないセレクター例外から保護する必要があります-respondsToSelector:

于 2015-01-28T05:45:41.087 に答える