Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XCode Objective-c使用单个变量设置多个变量_Objective C_Xcode - Fatal编程技术网

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

XCode Objective-c使用单个变量设置多个变量,objective-c,xcode,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 现在我的问题是,我如何才能在obj

我曾经为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;   
}
这基本上禁用了非必需的按钮,在这种情况下,专用种类始终等于Cat。 我需要禁用按钮7到30。 但我有超过80种不同的献身方式。我希望你能理解我的问题。 我希望能够禁用任意数量的按钮,其代码行数少于手动设置按钮所需的代码行数

像这样:

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个攻击/按钮之外,我已经完成了所有这些,这让我想到了这个问题

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

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

首先,将按钮放入一个数组中。您需要在interface builder中声明属性并建立连接

接下来,创建一个NSDictionary,将专用种类映射到的实例。使用80个映射初始化字典-每种映射一个。有了这个字典和手头的按钮数组,您将能够通过IdecatedKind查找索引集,遍历其中包含的索引,并在一个简单的循环中根据需要启用/禁用按钮。作为额外的奖励,你长长的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;
}];

首先,把你的按钮放进一个盒子里。您需要在interface builder中声明属性并建立连接

接下来,创建一个NSDictionary,将专用种类映射到的实例。使用80个映射初始化字典-每种映射一个。有了这个字典和手头的按钮数组,您将能够通过IdecatedKind查找索引集,遍历其中包含的索引,并在一个简单的循环中根据需要启用/禁用按钮。作为额外的奖励,你长长的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;
}];

你可以为你的变量做一个通用的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;
}

你可以为你的变量做一个通用的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;
}

据我所知,将UIButton的alpha设置为零使其禁用你是对的,设置为启用:否只是一种安全性,因为如果条件满足,这些按钮会变成alpha:0.3,从而重新启用它们。据我所知,将UIButton的alpha设置为零使其禁用你是对的,设置启用:否只是一种安全性,因为如果满足条件,这些按钮将变为alpha:0.3,从而重新启用。谢谢!我想这正是我所需要的,我考虑过switch,但我不知道如何正确地使用它。尽管方法的名称很糟糕。应该是燕麦粥了谢谢!我想这正是我所需要的,我考虑过switch,但我不知道如何正确地使用它。尽管方法的名称很糟糕。它应该是OAttackAtIndex:如果它们在nib中,不要在指定的初始化器中执行,因为视图尚未加载,所以它不会工作,只需将它们全部连接到一个IBOutletCollection。@Jim这是一个很好的建议,非常感谢!我编辑答案是为了利用IBOutletCollection。如果它们在nib中,不要在指定的初始化器中执行,因为视图还没有加载,所以不会工作,只需将它们全部连接到IBOutletCollection即可。@Jim这是一个很好的建议,非常感谢!我编辑了马的答案 使用iBootletCollection。