2010-11-23 13 views
0

私の方法でivarの名前を動的に指定する方法を教えてもらえますか?l2は私が標的にしようとしている瓶です。あなたはそれがプロパティとして宣言されている場合、これはiphoneの名前でリファクタリングするiPhone

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; 
    } 
    } 

おかげで、

マーク

+0

'l2'が作成された場所を表示すると助けになるかもしれません。 –

答えて

1

は、あなたがそれを得るためにKVCを使用することができるかもしれないん

//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:)]; 

} 

// 。

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

[EDIT]

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

// 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]; 
    } 
    } 

[EDIT]

あなたはおそらく必要があり、再構造あなたの全体のクラス。

@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 
+0

ご返信ありがとうございますが、私はこれをどのように使用することができないのですか? ポインタ名(l2) – crooksy88

+0

@ crooksy88を動的に指定しようとしていますが、実際にはできません。あなたが得ることができる最も近いものは、辞書にキーを指定することです。 –

+0

これで、キーと値のペアの辞書が作成され、dict内にl2 = soundMenuItemが追加されました。キー/値と等しくなるように私のl2ポインタを設定する方法は? – crooksy88

0

質問が明確になった後、私の最初の回答は無効でした。すべてのSoundMenuItemを保持するための辞書の使用に関する@stephenの答えは、私が提案したものです。

+0

@Stephen、それ以上の場合は、class_addIvar()を使用しても可能です。 –

+0

はいです。私はAOPがこれに必要であるかどうか分からないが、私はKVCがそれを修正すべきだと思う。 –

+0

@Stephen、私は全く同意します。私はこれが残酷で、実際の質問の意図ではないと確信しています。 –

0

ご不便をおかけして申し訳ありません、ご迷惑をおかけして申し訳ありません。私は文字制限のためコメントエリアにすべてを追加するのに苦労していました。

これは私が私のヘッダファイルでは...

をしようとしていますものです:

// SoundMenuItemクラス SoundMenuItemの*のL1です。 SoundMenuItem * l2;私の.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が(> 1 maxunlocked)ロックが解除されたかどうかを確認しますので、私の場合を

(私は実際には20個のボタン、各ゲームレベルのための1つを持っています)異なるイメージを使用するようにl2インスタンスをリセットします。

IF(maxunlocked> 1){

名= [NSStringのstringWithFormat:@ "レベル%d.png"、[[fliesArray objectAtIndex:2] intValue]。filenameHi = [NSString stringWithFormat:@ "レベル%dHi.png"、[[fliesArray objectAtIndex:2] intValue]];

L2 = [SoundMenuItem itemFromNormalSpriteFrameName:ファイル名selectedSpriteFrameName:filenameHiターゲット:自己セレクタ:@selector(レベル:)]。

}

そうではなく、文の場合は、上記の20回の反復を持つ、私は1つにそれをリファクタリングしたいんだ各ボタンに1つ。

私は自分自身をより鮮明にしたいと思っています。

+0

質問を編集して代わりに新しい質問テキストを入力することができます。 –

+0

私はあなたを助けるために私の質問を編集しました。将来、このような編集をあなたの質問に入れてください。下のスペースは答えのために予約されています。 –

関連する問題