我曾经在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个攻击/按钮之外,我已经完成了所有这些工作,这让我想到了这个问题!
答案 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)
为什么不将它们存储在数组中?您甚至可以使用这些值填充某些数组,并在需要时循环显示它们。