0

メソッド内で ivar 名を動的に指定する方法を誰か教えてもらえますか? l2 は、私がターゲットにしようとしている ivar です。

//this works
if (maxunlocked > 1) { 

filename = [NSString stringWithFormat:@"level%d.png", [[fliesArray objectAtIndex:2] intValue]];
filenameHi = [NSString stringWithFormat:@"level%dHi.png", [[fliesArray objectAtIndex:2] intValue]];

l2 = [SoundMenuItem itemFromNormalSpriteFrameName:filename selectedSpriteFrameName:filenameHi target:self selector:@selector(level:)];

}

//これはありません

    for (int i = 0; i<11; i++) {

    if (maxunlocked > i) {

    filename = [NSString stringWithFormat:@"level%d.png", [[fliesArray objectAtIndex:i] intValue]];
    filenameHi = [NSString stringWithFormat:@"level%dHi.png", [[fliesArray objectAtIndex:i] intValue]];


//this is where I'm attempting to dynamically specify the SoundMenuItem instance name.  
    sndMenuItem = [NSString stringWithFormat:@"l%d", i];

    sndMenuItem = [SoundMenuItem itemFromNormalSpriteFrameName:filename selectedSpriteFrameName:filenameHi target:self selector:@selector(level:)]; 
    sndMenuItem.userData = (id)i;
     }
    }

ありがとう、

マーク

4

3 に答える 3

1

プロパティとして宣言している場合は、KVC を使用して取得できる場合があります。

float h1 = [object height];
float h2 = [[object valueForKey:@"height"] floatValue];

[編集]

私はあなたの言っていることが理解できませんでした。答えはノーだ。変数名を動的に指定することはできません。あなたができることはこれです:

// if `l2` is a member of self. (as in self.l2)
for (int i = 0; i<11; i++) {

    if (maxunlocked > i) {

    filename = [NSString stringWithFormat:@"level%d.png", [[fliesArray objectAtIndex:i] intValue]];
    filenameHi = [NSString stringWithFormat:@"level%dHi.png", [[fliesArray objectAtIndex:i] intValue]];


//this is where I'm attempting to dynamically specify the SoundMenuItem instance name.  
    key = [NSString stringWithFormat:@"l%d", i];

    tmp = [SoundMenuItem itemFromNormalSpriteFrameName:filename selectedSpriteFrameName:filenameHi target:self selector:@selector(level:)]; 
    tmp.userData = (id)i;

    [self setValue:tmp forKey:key];
     }
    }

[編集]

おそらく、クラス全体を再構築する必要があります。

@interface myViewController: NSViewController {
    UIButton *sound1;
    UIButton *sound2;

    SoundMenuItem *l1;
    SoundMenuItem *l2;
}

@property (assign) IBOutlet UIButton *sound1; // connect up in IB
@property (assign) IBOutlet UIButton *sound2;

- (IBAction) clickSoundButton: (id)sender; // connect up to sound1 and sound2 in IB
- (SoundMenuItem) getSoundMenuItem: (int) i;

@end

@implementation myViewController

- (IBAction) clickSoundButton: (id)sender
{
   if (sender == (id)sound1) l1 = [self getSoundMenuItem: 1];
   if (sender == (id)sound2) l2 = [self getSoundMenuItem: 2];
}

- (SoundMenuItem) getSoundMenuItem: (int) i
{
if (maxunlocked <= i) return

    NSString *filename = [NSString stringWithFormat:@"level%d.png", [[fliesArray objectAtIndex:i] intValue]];
    NSString *filenameHi = [NSString stringWithFormat:@"level%dHi.png", [[fliesArray objectAtIndex:i] intValue]];

    SoundMenuItem *sndMenuItem = [SoundMenuItem itemFromNormalSpriteFrameName:filename selectedSpriteFrameName:filenameHi target:self selector:@selector(level:)]; 
    sndMenuItem.userData = (id)i;
    return sndMenuItem; //(assuming it is auto-released)
}
@end
于 2010-11-23T14:06:16.753 に答える
0

質問が明確になった後、私の最初の答えは有効ではありませんでした。辞書を使用してすべての SoundMenuItem を保持することを提案した @stephen の回答は、私が提案したものでもあります。

于 2010-11-23T14:50:46.237 に答える
0

情報不足で申し訳ありませんが、ご理解のほどよろしくお願いいたします。文字数制限のため、コメント欄に全部載せるのに苦労しました。

これは私が試みていることです...

私のヘッダーファイルでは:

//SoundMenuItem はクラスの SoundMenuItem *l1; SoundMenuItem *l2; (実際には、各ゲーム レベルに 1 つずつ、合計 20 個のボタンがあります)

私の.mファイルで

//here I set up the l1 button which is never locked
l1 = [SoundMenuItem itemFromNormalSpriteFrameName:filename selectedSpriteFrameName:filenameHi target:self selector:@selector(level:)];

//and here I set the l2 button to be locked by default  
l2 = [SoundMenuItem itemFromNormalSpriteFrameName:@"levellock.png" selectedSpriteFrameName:@"levellockHi.png" target:self selector:@selector(doNothing:)];

//ここで、level2 がロック解除されている (maxunlocked > 1) かどうかを確認し、ロック解除されている場合は、l2 インスタンスをリセットして別のイメージを使用します。

if (maxunlocked > 1) {

ファイル名 = [NSString stringWithFormat:@"level%d.png", [[fliesArray objectAtIndex:2] intValue]]; filenameHi = [NSString stringWithFormat:@"level%dHi.png", [[fliesArray objectAtIndex:2] intValue]];

l2 = [SoundMenuItem itemFromNormalSpriteFrameName:filename selectedSpriteFrameName:filenameHi target:self selector:@selector(level:)];

}

したがって、上記の if ステートメントを 20 回繰り返すのではなく、ボタンごとに 1 回ずつリファクタリングしたいと考えています。

私は自分自身をより明確にしたことを願っています。

于 2010-11-23T15:06:41.203 に答える