Получить 2 строки из случайного словаря в .plist - PullRequest
0 голосов
/ 21 марта 2011

Я новичок в программировании iphone. Я боролся с этой проблемой и пробовал так много разных онлайн-решений, но не могу получить желаемый результат.

Я хочу отобразить 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'. Я хотел бы иметь возможность получить его из любого массива. Любая помощь будет принята с благодарностью. Спасибо.

Ответы [ 3 ]

0 голосов
/ 21 марта 2011

Как этот код мог "показать правильный результат"?Он должен вызывать сбои каждую секунду (с предоставленными вами тестовыми данными) из-за исключительной ситуации, вызванной этим кодом:

                                                    // 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 голосов
/ 21 марта 2011

@ 7KV7 правильно, вам понадобятся случайно отформатированные ключи во время выполнения.

Для ключей с одинаковым форматом вам требуется начальный текст ключа, в вашем случае это 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];
0 голосов
/ 21 марта 2011

Поскольку вы используете NSMutableArray *array = [plistDict objectForKey:@"q1"];, будет взят только массив из q1.Вы должны получить массив случайным образом, выбрав ключ для словаря случайным образом.

ОБНОВЛЕНИЕ

Например, если у вас есть 7 массивов вопросов с именами q1, q2,q3, q4, q5, В6, В7.Вы должны выбрать массив случайным образом из этого.Таким образом, вы можете использовать

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

Это даст вам случайный массив для вопросов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...