2010-11-23 2 views
0

Может ли кто-нибудь сказать мне, как я могу динамически указывать имя ivar в моем методе? l2 - Ивар, которого я пытаюсь настроить.Рефакторинг iPhone с именами 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; 
    } 
    } 

Спасибо,

Марк

+0

Это может помочь, если вы покажете, где создается `l2`. – 2010-11-23 14:56:43

ответ

1

Если у вас есть он объявлен как свойство, вы можете быть в состоянии использовать KVC, чтобы получить его ,

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 2010-11-23 14:26:59

+0

@ crooksy88, вы на самом деле не можете этого сделать. Самое близкое, что вы можете получить, это указать ключ в словаре. – 2010-11-23 14:35:14

+0

ОК, поэтому теперь у меня есть словарь пар ключ/значение, а l2 = soundMenuItem внутри dict. Как бы я теперь установил свой указатель l2 равным ключу/значению? – crooksy88 2010-11-23 14:55:35

0

После выяснения вопроса мой первый ответ недействителен. Ответ @stephen с предложением использовать словарь для хранения всех SoundMenuItem - это то, что я бы предложил.

0

Извините, что информация отсутствует и благодарит за ваше терпение. Я изо всех сил старался добавить все это в область комментариев из-за ограничения персонажа.

Это то, что я пытаюсь ...

В моем файле заголовка:

// SoundMenuItem класс SoundMenuItem * l1; SoundMenuItem * l2; (Я на самом деле есть 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 для использования разных изображений.

, если (maxunlocked> 1) {

имя_файла = [NSString stringWithFormat: @ "Уровень% 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 :)];

}

Таким образом, вместо 20 итераций выше, если оператор, один для каждой кнопки я желающей реорганизовать его в один.

Надеюсь, я прояснил ситуацию.

Смежные вопросы