2012-05-09 270 views
0

我編程遊戲,有40個級別,我存儲在我的.plist各級數據被訪問的屬性。這很好,但現在我試圖實現多個級別,我正在尋找一種方法來調用基於級別的單例屬性,而無需手動編碼開關/案例。我想這樣做如下:如何動態地更改

這是我用它來拉我的數據的代碼,但你可以看到,我已經硬編碼的「dictionaryLevel1Data」屬性。

int capacity = [[sharedDataManager.dictionaryLevel1Data objectForKey:@"typeWarrior"] intValue]; 

我想設置一個變量,並具有被稱爲基於這樣的單身人士的屬性,我知道這是行不通的。請注意我將如何替換「dictionaryLevel1Data」

NSString level = @"1"; 

int capacity = [[sharedDataManager.[NSString stringWithFormat:@"dictionaryLevel%@Data", level] objectForKey:@"typeWarrior"] intValue]; 

有關如何完成此操作的任何建議將不勝感激。我總是可以爲每個級別手動設置一個開關/外殼,但是每個關卡有40個關卡和50多個不同的對象類型,這會很粗糙,似乎必須有更好的方法。我討厭硬編碼值,喜歡簡化我的代碼,並簡單地更新通過泛型類和方法運行的變量。

回答

0

如果你想這樣做,那麼你可以使用Key-Value-Coding,從字符串中獲取一個屬性值。這則訊息的接受的答案顯示瞭如何使用它(很容易):Objective-C get a class property from string

對於你的任務將是這個樣子:

int capacity = [[[sharedDataManager valueForKey:[NSString stringWithFormat:@"dictionaryLevel%@Data", level]] objectForKey:@"typeWarrior"] intValue]; 
+0

謝謝Johannes!這完全是我在找的東西!感謝也鏈接另一篇文章,因爲它引導我回答我的另一個問題。乾杯! :0) – XBXSlagHeap

+0

不客氣,很高興它也可以解決第二個問題! –

1

你爲什麼不去做這樣的;

使用2級的數據圖;

//sharedDataManager.levelData is a NSDictionary that contains lots of NSDictionarys 
NSDictionary *levelData = [sharedDataManager.levelData objectForKey:[NSString stringWithFormat:@"dictionaryLevel%@Data", level]]; 

int capacity = [levelData objectForKey:@"typeWarrior"] intValue]; 
+0

謝謝...這是我的後備選項。我真的很喜歡Johannes的建議。放鬆一下,再次感謝您的快速響應! – XBXSlagHeap

0

您可以使用:

NSString level = @"dictionaryLevel1Data" 
SEL methodSelector = NSSelectorFromString(level); 
if ([sharedDataManager conformsToSelector:@selector(methodSelector)]) { 
    NSDictionary *levelData = [sharedDataManager performSelector:methodSelector]; 
    // Do whatever you need here 
} 

我假設所有dictionaryLevelData都是合成的,並且以getter爲名。

(請注意,我沒有編譯它,但它應該工作)

+0

感謝您的反饋。這也可以起作用......就像在Johannes的建議中我從未見過的valueForKey一樣。再次感謝。 – XBXSlagHeap