可可宏 - 独特的问题

时间:2010-12-14 18:55:27

标签: cocoa xcode ipad macros

我需要#define帮助才能执行以下操作:

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

SETLABEL()宏应该采用“i”的intValue并将其粘贴到标签名称中:

当i == 1 - &gt; label1.text =(stuff)

当i == 2 - &gt; label2.text =(stuff)

这可能吗?以下失败,因为它粘贴了“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 个答案:

答案 0 :(得分:4)

这个问题的“真实”答案是用@property声明你的标签(它们可能已经是),然后执行:

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

然而,真正的问题在这里是:为什么你有47个标签都显示相同的东西,为什么它们没有更好的名字呢?

编辑检索基元:

虽然可以使用valueForKey:object_getInstanceVariable()之类的内容检索原始ivars的值,但您要求这样做的事实(在我的书中)是代码设计不佳的标志。即使不查看您的代码,我也向您保证,有更好的方法可以做到这一点。

话虽如此,这是一个关于如何通过名称从实例变量中获取原始值的负载枪:

#import <objc/runtime.h>

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

但是,如果您在生产环境中使用此代码而不是明确调试某些内容,那么我会说您应该得到任何崩溃。 (并不是说这段代码容易崩溃,而是它可能代表其余的代码)

答案 1 :(得分:2)

查看NSArrayNSSet-makeObjectsPerformSelector: