2011-03-21 152 views
0

我是iphone編程的新手。我一直在努力解決這個問題,並嘗試了許多不同的在線解決方案,但無法獲得理想的結果。從.plist中的隨機字典中獲取2個字符串

我想從隨機數組或字典中顯示2個字符串(我不確定最好使用什麼)它會顯示一個隨機問題與配對答案。這是我到目前爲止有:

<dict> 
<key>q2</key> 
<array> 
    <string>answer2</string> 
    <string>question2</string> 
</array> 
<key>q1</key> 
<array> 
    <string>answer1</string> 
    <string>question1</string> 
</array> 

.M:

 NSString *fileContents = [[NSBundle mainBundle] pathForResource:@"questions" ofType:@"plist"]; 

    NSMutableDictionary *plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:fileContents]; 

    NSMutableArray *array = [plistDict objectForKey:@"q1"]; 

    srandom(time(NULL)); 

    int r = arc4random() %[array count]; 

    NSString *arrayData1 = [array objectAtIndex:r]; 
    NSString *arrayData2 = [array objectAtIndex:r+1]; 

    label1.text = arrayData1; 
    label2.text = arrayData2; 

這顯示了正確的結果。但顯然它只是從'q1'陣列中挑選出來的。我希望能夠從任何數組中獲得它。任何幫助將不勝感激。謝謝。

+0

您是否注意到每隔一次調用此方法都會出現越界異常?這段代碼在多個方面都是錯誤的。 – 2011-03-21 11:23:20

+0

感謝您的回覆。我很新,一直在關注在線教程和我的書。我真的很想了解這一點。如果你能解釋你的意思?或者指向一個有用的鏈接,我會很感激。 – waqqas 2011-03-21 11:33:59

回答

0

怎麼會這樣的代碼「顯示正確結果」的亂陣?它應該崩潰每秒(與你所提供的測試數據)呼叫,因爲一個出界異常造成這段代碼的:

            // assume array has 10 objects 
int r = arc4random() %[array count];    // r = 9 

NSString *arrayData1 = [array objectAtIndex:r];  // index 9, everything ok 
NSString *arrayData2 = [array objectAtIndex:r+1]; // index 9 + 1 = 10. exception 


如果我是你,我會從根本上改變代碼和數據的結構。使用NSArray作爲你的問題和每個單獨問題的NSDictionary更有意義。 如果字典中的鍵名爲q1,q2,q3,q4等,沒有理由使用NSDictionary。

然後,你可以使用這樣的東西,這是更容易理解和更乾淨。

NSString *pathToQuestions = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"plist"]; 
NSMutableArray *questions = [[[NSMutableArray alloc] initWithContentsOfFile:pathToQuestions] autorelease]; 

int questionIndex = arc4random() %[questions count]; 

NSDictionary *question = [questions objectAtIndex:questionIndex]; 
NSString *answerStr = [question objectForKey:@"answer"]; 
NSString *questionStr = [question objectForKey:@"question"]; 
+0

糾正我,如果我錯了。您的代碼選擇一個隨機字典,並獲取2個字符串值,這些值是名稱回答問題。因爲我只是嘗試這樣做,並沒有工作,我改變了我的.plist結構: '代碼' \t dict2 \t \t \t 問題 \t \t 約翰 \t \t 答案 \t \t 史密斯 \t \t dict1 \t \t \t 問題 \t \t 戴夫 \t \t 哈羅德 \t \t 馬哈茂德 \t waqqas 2011-03-21 11:53:31

0

由於您使用的是NSMutableArray *array = [plistDict objectForKey:@"q1"];,因此只會使用q1中的數組。您必須隨機選擇字典的關鍵字來隨機獲取數組。

UPDATE

例如如果u有說的名爲Q1,Q2,Q3,Q4,Q5,Q6,Q7問題7個陣列。你必須從中隨機選擇一個數組。所以,你可以使用

int q = arc4random() %[[plistDict allKeys] count]; 
NSMutableArray *randomQuestionarray = [[plistDict objectForKey:[NSString stringWithFormat:@"q%d",q]]; 

這會給你的問題

+0

感謝您的回覆。我只是無法弄清楚你提到的功能的語法。你能指出我正確的方向嗎? – waqqas 2011-03-21 11:22:12

+0

查看我的更新回答 – visakh7 2011-03-21 11:27:51

+0

請檢查@fluchtplunkt說的話。這會導致問題 – visakh7 2011-03-21 11:28:58

0

@ 7KV7是正確的,你需要隨機格式化關鍵的在運行時。

對於andomly格式化關鍵的,你需要你的關鍵的起始文本,你的情況是q和許可證號,

例如,讓我們假設你有總量的50個鍵的鍵值必須像這個 q0,q1,q2,----- q49。

#include <stdlib.h> 
... 
... 


NSInteger myRandomInt = arc4random() % numberOfKeys ; 
NSString myRandomKey = [[NSSting alloc] initWithFormat:@"q%d", myRandomInt]; 

NSMutableArray *array = [plistDict objectForKey:myRandomKey]; 
相關問題