Макрос какао - уникальный вопрос - PullRequest
0 голосов
/ 14 декабря 2010

Мне нужна помощь с #define, чтобы сделать следующее:

for (int i = 0; i < 47; ++i)  {     SETLABEL(i)     }

Макрос SETLABEL () должен взять значение int i «i» и вставить его в имя метки:

когда я == 1 -> label1.text = (материал)

когда я == 2 -> label2.text = (материал)

Возможно ли это? Следующее с треском проваливается, потому что оно вставляет «i», а не значение «i»:

#define SETLABEL(x)    [label##x setText: [foo stringValue]];

РЕДАКТИРОВАТЬ: Спасибо за всю помощь. Теперь мой код выглядит так:

объявление для int - iB [25]

-(void)stuff {
int x;
int labelGo = 1;

for (int i = 1; i < 25; ++i) {
    NSString * labelName = [NSString stringWithFormat:@"magicItemBoughtTot%d", i];
    UILabel * currentLabel = [self valueForKey:labelName];
    if (iB[i] == itemPH) { // if label is not empty
        [currentLabel setText: [NSString stringWithFormat:@"%i", 
                                        ([currentLabel.text intValue] + 1)]];
        labelGo = 0;
    }
}
utilityNum = nil;
utilityNum = [NSNumber numberWithInt:labelGo];

}

Ответы [ 2 ]

4 голосов
/ 14 декабря 2010

«Настоящий» ответ на этот вопрос состоит в том, чтобы объявить ваши метки с @property (что они, вероятно, уже есть), а затем сделать:

for (int i = 0; i < 47; ++i) {
  NSString * labelName = [NSString stringWithFormat:@"label%d", i];
  UILabel * currentLabel = [self valueForKey:labelName];
  [currentLabel setText:(stuff)];
}

Однако реальный вопрос заключается в следующем: с какой стати у вас 47 ярлыков, на которых все изображено одно и то же, и почему на земле у них нет лучших имен?

edit получение примитивов:

Хотя можно получить значения примитивных иваров, используя такие вещи, как valueForKey: или object_getInstanceVariable(), тот факт, что вы запрашиваете это, является (в моей книге) признаком плохо разработанного кода. Даже не глядя на ваш код, я гарантирую вам, что есть лучший способ сделать это.

Как говорится, вот загруженный пистолет о том, как получить примитивные значения из переменных экземпляра по имени:

#import <objc/runtime.h>

//self has an ivar named "i"
int *iPtr = 0;
object_getInstanceVariable(self, "i", (void**)&iPtr);
NSLog(@"%d", (int)iPtr);

Однако, если вы когда-нибудь будете использовать этот код в производственной среде для чего-либо, кроме явной отладки чего-либо, то я бы сказал, что вы заслуживаете любых сбоев, которые вы получаете. (Не то, чтобы этот код был подвержен сбоям, а скорее, что он, вероятно, будет представлять остальную часть кода)

2 голосов
/ 14 декабря 2010

Посмотрите на NSArray, NSSet и -makeObjectsPerformSelector:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...