2013-03-02 2 views
2

У меня есть 10 UIButtons, созданных в истории, ОК?
Я хочу добавить случайные числа, которые не повторяют эти числа, т. Е. Числа от 0 до 9, которые перемежаются при загрузке представления.UIButton со случайным текстом/значением или тегом

Я попытался найти в Google и здесь использовать мои существующие кнопки (10 UIButton) и просто применить их к случайным значениям. Большинство найденных способов (arc4random() % 10), повторите цифры.

Все результаты обнаружили, что создание кнопки динамически. Кто-нибудь прошел через это?

+1

Eh? Боюсь, ваш вопрос не имеет смысла, я думаю, что что-то могло быть потеряно в переводе? – sjwarner

+0

ОК, я отредактирую. –

+0

@sjwarner отредактирован. –

ответ

2

Создайте массив чисел. Затем выполните набор случайных подстановок элементов массива. Теперь у вас есть свои уникальные номера в случайном порядке.

- (NSArray *)generateRandomNumbers:(NSUInteger)count { 
    NSMutableArray *res = [NSMutableArray arrayWithCapacity:count]; 
    // Populate with the numbers 1 .. count (never use a tag of 0) 
    for (NSUInteger i = 1; i <= count; i++) { 
     [res addObject:@(i)]; 
    } 

    // Shuffle the values - the greater the number of shuffles, the more randomized 
    for (NSUInteger i = 0; i < count * 20; i++) { 
     NSUInteger x = arc4random_uniform(count); 
     NSUInteger y = arc4random_uniform(count); 
     [res exchangeObjectAtIndex:x withObjectAtIndex:y]; 
    } 

    return res; 
} 

// Apply the tags to the buttons. This assumes you have 10 separate ivars for the 10 buttons 
NSArray *randomNumbers = [self generateRandomNumbers:10]; 
button1.tag = [randomNumbers[0] integerValue]; 
button2.tag = [randomNumbers[1] integerValue]; 
... 
button10.tag = [randomNumbers[9] integerValue]; 
+0

отличное решение! Я хотел бы получить TAG также динамически. Но я лучше, чем вставлять кнопки в массив. еще раз спасибо –

1

@meth имеет правильную идею. Если вы хотите удостовериться, что числа не повторяются, попробуйте что-то вроде этого: (обратите внимание: верхнее будет наивысшее число для генерации. Убедитесь, что это => сумма, или иначе это будет циклично навсегда и всегда;)

- (NSArray*) makeNumbers: (NSInteger) amount withTopBound: (int) top 
{ 
    NSMutableArray* temp = [[NSMutableArray alloc] initWithCapacity: amount]; 

    for (int i = 0; i < amount; i++) 
    { 
     // make random number 
     NSNumber* randomNum; 

     // flag to check duplicates 
     BOOL duplicate; 

     // check if randomNum is already in your array 
     do 
     { 
      duplicate = NO; 
      randomNum = [NSNumber numberWithInt: arc4random() % top]; 

      for (NSNumber* currentNum in temp) 
      { 
       if ([randomNum isEqualToNumber: currentNum]) 
       { 
        // now we'll try to make a new number on the next pass 
        duplicate = YES; 
       } 
      } 
     } while (duplicate) 

     [temp addObject: randomNum]; 
    } 

    return temp; 
} 
+0

Я использую случайное поколение, которое указал @maddy, но это не правильный способ сделать это, однако, частично да ... но спасибо! –

Смежные вопросы