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個の変数を設定する必要があります。私はいつもそれらすべてを一つずつ設定してきましたが、それはスペースを取り、私のソースコードは現在1万行を超えています。

これは私が持っているものです:

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用であり、私はストーリーボードを使用しています。

追加情報:

有効に設定:NOは、条件が満たされた場合にそれらのボタンがalpha:0.3に変わり、再び有効になるため、単に安全です。残念ながら、私のコードは大きすぎて、すべてのルートと条件を投稿できません。これらのボタンは猫が学習した攻撃であり、最大30の攻撃がありますが、猫はそのうちの6つしか学習しません。これらの24個のボタンは完全に非表示である必要があり、6個の攻撃は、まだ学習されていなくても、少なくとも部分的に表示されている必要があります。これらの攻撃を学習すると、適切なボタンが完全に表示されます。それは猫のためです。このゲームでは、猫は新しいゲームを開始するときに手に入れる3つの基本的な動物の1つであるため、制限があります。より大きく、よりまれな動物は、6回以上の攻撃を学ぶ可能性があります。

幸いなことに、無効にする必要がある24の攻撃/ボタンを除いて、私はすでにすべてのことを実行しました。そのため、この質問にたどり着きました。

4

3 に答える 3

3

まず、ボタンをに入れますIBOutletCollection(UIButton)。プロパティを宣言し、InterfaceBuilderで接続する必要があります。

次に、のインスタンスにNSDictionaryマップするを作成します。種類ごとに1つずつ、80のマッピングを使用して辞書を初期化します。この辞書とボタン配列を使用すると、によって設定されたインデックスを検索し、それに含まれるインデックスを反復処理し、必要に応じてボタンを有効/無効にすることができます。追加のボーナスとして、//の長いチェーンもなくなります。DedicatedkindNSIndexSetDedicatedkindifthenelse

ヘッダ:

@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 に答える