1

我曾经为 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,我正在使用情节提要。

额外信息:

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

幸运的是,我已经完成了所有这些,除了必须禁用的 24 个攻击/按钮,这导致我提出了这个问题!

4

3 回答 3

3

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

接下来,创建一个NSDictionary映射DedicatedkindNSIndexSet. 用 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;
}];
于 2012-08-31T13:10:44.997 回答
1

你可以为你的变量做一个通用的吸气剂,比如:

- (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;
}
于 2012-08-31T13:11:25.600 回答
0

为什么不将它们存储在数组或其他东西中?你甚至可以用这些值填充一些数组,并在需要时循环它们。

于 2012-08-31T13:08:54.793 回答