Возьмите какой-нибудь объект в NSArray и поместите его случайным образом в метки

Я выбираю индекс массива из списка. Это словарь с 10 различными строками со строкой.

    NSArray* tableau = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"codes" ofType:@"plist"]];

NSDictionary* phrase = [tableau objectAtIndex:nombreChoisi];

Я хотел бы взять 6 элементов и поместить их в 6 меток случайным образом

Я попытался это передать его в новый NSMutableArray, но это не работает:

    NSArray* tableau = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"codes" ofType:@"plist"]];

NSDictionary* phrase = [tableau objectAtIndex:nombreChoisi];

NSString *phraseMelange1 = [phrase objectForKey:@"texte1"] ;
NSString *phraseMelange2 = [phrase objectForKey:@"texte2"] ;
NSString *phraseMelange3 = [phrase objectForKey:@"texte3"] ;
NSString *phraseMelange4 = [phrase objectForKey:@"texte4"] ;
NSString *phraseMelange5 = [phrase objectForKey:@"texte5"] ;
NSString *phraseMelange6 = [phrase objectForKey:@"texte6"] ;

NSMutableArray *tableauMelange = [[NSMutableArray alloc] initWithObjects:
                                  phraseMelange1,
                                  phraseMelange2,
                                  phraseMelange3,
                                  phraseMelange4,
                                  phraseMelange5,
                                  phraseMelange6,
                                  nil];

for(int i=0;i<6;i++)
{
    int idx;
    idx = random()%[tableauMelange count];
    NSString* titre = [tableauMelange objectAtIndex:idx];
    texte1.text = titre;
    [tableauMelange removeObjectAtIndex:idx];
}
{
    int idx;
    idx = random()%[tableauMelange count];
    NSString* titre = [tableauMelange objectAtIndex:idx];
    texte2.text = titre;
    [tableauMelange removeObjectAtIndex:idx];
}
{
    int idx;
    idx = random()%[tableauMelange count];
    NSString* titre = [tableauMelange objectAtIndex:idx];
    texte3.text = titre;
    [tableauMelange removeObjectAtIndex:idx];
}
{
    int idx;
    idx = random()%[tableauMelange count];
    NSString* titre = [tableauMelange objectAtIndex:idx];
    texte4.text = titre;
    [tableauMelange removeObjectAtIndex:idx];
}
{
    int idx;
    idx = random()%[tableauMelange count];
    NSString* titre = [tableauMelange objectAtIndex:idx];
    texte5.text = titre;
    [tableauMelange removeObjectAtIndex:idx];
}
{
    int idx;
    idx = random()%[tableauMelange count];
    NSString* titre = [tableauMelange objectAtIndex:idx];
    texte6.text = titre;
    [tableauMelange removeObjectAtIndex:idx];
}
[tableauMelange release];

Я также попробую это с:

    NSMutableArray *array;
array=[[phrase allKeys] mutableCopy];

Но это дает мне ключи, а не ценность без возможности выбрать те, которые мне нужны.

Спасибо за вашу помощь.

Что не работает с этим? Можете ли вы быть более конкретным в отношении ошибок / плохого поведения, которые вы видите?
fbrereto 12.10.2009 22:08:19
1 ОТВЕТ
РЕШЕНИЕ

Ваш общий подход здесь хорош, но ваша логика зацикливания кажется ошибочной. Я собираюсь кое-что почистить и посмотреть, поможет ли это вам.

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

NSArray *myLabels = [NSArray arrayWithObjects:texte1, texte2, texte3, texte4, texte5, texte6, nil];

Теперь давайте создадим изменяемый массив с вашими фразами - это можно сделать с помощью цикла, потому что вы знаете, что ключи, которые вы ищете, имеют последовательные цифры:

// This is your existing code that reads the phrases from a plist:
NSArray* tableau = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"codes" ofType:@"plist"]];
NSDictionary* phrase = [tableau objectAtIndex:nombreChoisi];

// Now read the phrases into a mutable dictionary:
NSMutableArray *myPhrases = [NSMutableArray arrayWithCapacity:6];
for (int i = 1; i <= 6; i++) {
  NSString *myPhrase = [phrase objectForKey:[NSString stringWithFormat:@"texte%d", i]];
  [myPhrases addObject:myPhrase];
}

Теперь нам нужно создать цикл для случайного извлечения фраз из изменяемого словаря и назначения их случайной метке. Мы пройдем этот цикл шесть раз, каждый раз выбирая случайную фразу и назначая ее метке. После назначения фразы мы удалим ее из словаря, чтобы она больше не использовалась.

for (int i = 0; i < 6; i++) {

  // Choose a random phrase
  int randIdx = random() % [myPhrases count];
  NSString *randPhrase = [myPhrases objectAtIndex:randIdx];

  // Assign the next label's text
  [myLabels objectAtIndex:i].text = randPhrase;

  // Remove the phrase from the mutable dictionary so it isn't used again:
  [myPhrases removeObjectAtIndex:randIdx];
}
2
12.10.2009 22:23:24
Это помогает мне, но у меня есть ошибка «запрос на член, не являющийся структурным объединением» в: [myLabels objectAtIndex: i] .text = randPhrase; Странно, потому что, texte1.text = randPhrase; все в порядке.
Rufilix 13.10.2009 08:26:55