XCode Objective-c使用单个变量设置多个变量

时间:2012-08-31 13:04:04

标签: objective-c xcode

我曾经在Windows的宏脚本上工作,这是可行的:

VAR=0

Label>LOOP
VAR=VAR+1
ANOTHERVAR%VAR%=8 (all variables up to 30 will be set to 8)
if>VAR>=30 {Goto>BREAK}else{Goto>LOOP}
Label>BREAK
EXIT

上面的代码会有效地将“ANOTHERVAR1”设置为“ANOTHERVAR30”到值8。

现在我的问题是,如何在objective-c上获得相同的结果? 我有很多变量要设置。现在在XCode上我需要设置30个变量。我总是一个接一个地设置它们,但它占用空间,我的源代码现在超过10k行。

这就是我所拥有的:

if (Dedicatedkind==@"Cat"){
_oAttack7.alpha=0;
_oAttack7.enabled=NO;   
}

这基本上禁用了非必需按钮,在这种情况下,Dedicatedkind总是等于Cat。 我需要禁用按钮7到30。 但我有80多个不同的Dedicatedkind。我希望你理解我的问题。 我希望能够禁用任意数量的按钮,而不需要手动设置所有按钮的行数。

像这样:

if (Dedicatedkind==@"Cat"){
_oAttack7.alpha=0;
_oAttack7.enabled=NO;
_oAttack8.alpha=0;
_oAttack8.enabled=NO;
_oAttack9.alpha=0;
_oAttack9.enabled=NO;
And so on, until I reach _oAttack30
}

如果它很重要,那就是iphone,我正在使用故事板。

额外信息:

设置已启用:“否”只是一种安全性,因为如果满足条件,那些按钮将变为alpha:0.3,从而重新启用它们。 不幸的是,我的代码太大,无法发布每个根和条件。 这些按钮是由猫学习的攻击,最多有30次攻击,但猫只能学习其中的6个。这24个按钮必须完全不可见,而6个攻击,即使尚未学习,也必须至少部分可见。在学习这些攻击时,相应的按钮将完全可见。这是为了猫。在这个游戏中,猫是开始新游戏时你拥有的三种基本动物之一,因此有局限性。更大,更稀有的动物可能会学习超过6次攻击。

幸运的是,除了必须禁用的24个攻击/按钮之外,我已经完成了所有这些工作,这让我想到了这个问题!

3 个答案:

答案 0 :(得分:3)

首先,将按钮放入IBOutletCollection(UIButton)。您需要在接口构建器中声明属性并建立连接。

接下来,创建一个NSDictionary,将Dedicatedkind映射到NSIndexSet的实例。使用80个映射初始化字典 - 每种类型一个。使用此字典和按钮数组,您将能够查找由Dedicatedkind设置的索引,遍历其中包含的索引,并在简单循环中根据需要启用/禁用按钮。作为额外的奖励,您的长链if / then / else也将消失。

部首:

@property (nonatomic, readwrite) IBOutletCollection(UIButton) NSArray *allButtons;
NSDictionary *buttonIndexByKind;

指定的初始化程序:

NSIndexSet *catSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(5, 30)];
NSIndexSet *dogSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(2, 15)];
buttonIndexByKind = [NSDictionary dictionaryWithObjectsAndKeys:
    catSet, @"Cat", dogSet, @"Dog", nil
];

当您需要启用/禁用按钮时:

NSIndexSet *toDisable = [buttonIndexByKind objectForKey:Dedicatedkind];
[toDisable enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop){
    UIButton *btn = [allButtons objectAtIndex:idx];
    btn.alpha=0;
    btn.enabled=NO;
}];

答案 1 :(得分:1)

你可以为你的变量做一个通用的getter,比如说:

- (id)getOAttack:(int)index {
    switch (index) {
        case 1:
            return _oAttack1;
        //etc
    }
}

然后,只要您需要设置多个属性,就可以这样做

for (int i = 0; i < 30; i++) {
    id oAttack = [self getOAttack:i];
    oAttack.alpha = 0;
    oAttack.enabled = NO;
}

答案 2 :(得分:0)

为什么不将它们存储在数组中?您甚至可以使用这些值填充某些数组,并在需要时循环显示它们。