2012-08-31 76 views
1

我曾經對宏觀腳本可在Windows,這是可行的:的XCode Objective-C中設置多個變量的單變量

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 ([email protected]"Cat"){ 
_oAttack7.alpha=0; 
_oAttack7.enabled=NO; 
} 

這基本上禁止非必需的按鈕,在這種情況下Dedicatedkind總是等於貓。 我需要禁用按鈕7至30. 但我已經有超過80個不同的專用的。我希望你能理解我的問題。 我希望能夠使用更少的代碼行數來禁用任何數量的按鈕,而不是將它們全部手動設置。

像這樣:

if ([email protected]"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是一個簡單的安全性,因爲如果條件得到滿足,這些按鈕開啓阿爾法:0.3,從而重新允許他們。 不幸的是,我的代碼太大,無法發佈每個根和條件。 這些按鈕是貓所學習的攻擊,最多有30次攻擊,但貓只學習其中的6個。這24個按鈕必須是完全不可見的,而6次攻擊,即使尚未學習,也必須至少部分可見。在學習這些攻擊時,適當的按鈕變爲完全可見。這是爲了貓。在這個遊戲中,貓是開始新遊戲時獲得的三種基本動物之一,因此具有侷限性。更大,更稀有的動物可能會學習6次以上的攻擊。

幸運的是,除了必須禁用的24個攻擊/按鈕外,我已經完成了所有這些操作,這導致了我的這個問題!

回答

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; 
}]; 
+0

聽起來很乾淨,我會努力的。謝謝! – JMC17

+0

如果他們在筆尖,不要在您指定的初始化工具中使用它(它不會工作,因爲視圖尚未加載),只需將它們全部連接到「IBOutletCollection」。 – Jim

+0

@Jim這是一個很好的建議,非常感謝!我編輯了使用'IBOutletCollection'的答案。 – dasblinkenlight

0

你爲什麼不把它們存儲在數組或其他東西?你甚至可以用這些值填充一些數組,並在需要時循環。

+0

而且據我知道設定的UIButton的alpha零化妝的禁用它 –

+0

你說得對,設置啓用: NO僅僅是一種安全措施,因爲如果條件得到滿足,那些按鈕會變成alpha:0.3,從而重新啓用它們。 – JMC17

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; 
} 
+0

謝謝!我認爲這正是我需要的,我想過關於開關,但我不知道如何正確使用它。 – JMC17

+2

雖然方法的名稱很糟糕。它應該是'OAttackAtIndex:' –