2013-02-04 147 views
1

我已经创建了一个测验,它从plist中将问题绘制到数组中,并在uilabel中显示问题,并在uibutton中显示三个可能的答案。我的问题是,如何为按钮创建随机顺序,以便三个答案不总是以相同的顺序显示?按钮的随机顺序

任何帮助将不胜感激。

杰米

+0

你是如何存储你的选择与正确答案 –

+0

我存储选项加入到我的按钮,这样 '[btnA的setTitle:[问题objectAtIndex:R] objectForKey:@ “A”] forState:UIControlStateNormal]。 [btnB setTitle:[[questions objectAtIndex:r] objectForKey:@“B”] forState:UIControlStateNormal]; [btnC setTitle:[[questions objectAtIndex:r] objectForKey:@“C”] forState:UIControlStateNormal];' 然后我有三个按钮,根据用户的回答给出0,10或15个点 - 就像这样(IBAction)answer1:(id)发送者{self setPoints:[self points] + 0]; progress.progress + = 0.20f; }' –

回答

4

与@ Abizern的答案一起去。拥有固定按钮并随机排列阵列会更有效率。你可以做这样的事情:

//NSMutableArray *questions = [[NSMutableArray alloc] initWithObjects:@"1", @"2", @"3", @"4", nil]; 

NSMutableArray *unorderedQuestions = [[NSMutableArray alloc] init]; 
for (int i=0; i < [questions count]; i++) { 
    int lowerBound = 0; 
    int upperBound = 100; 
    int rndValue = lowerBound + arc4random() % (upperBound - lowerBound); 
    [unorderedQuestions addObject:[[NSArray alloc] initWithObjects:[questions objectAtIndex:i], [NSString stringWithFormat:@"%i", rndValue], nil]]; 
} 

NSArray* sortedArray = [unorderedQuestions sortedArrayUsingFunction:order context:NULL]; 
//or 
// questions = [unorderedQuestions sortedArrayUsingFunction:order context:NULL]; 
NSLog(@"%@", sortedArray); 

,有的地方把这个功能:

static NSInteger order (id a, id b, void* context) { 
    NSString* catA = [a lastObject]; 
    NSString* catB = [b lastObject]; 
    return [catA caseInsensitiveCompare:catB]; 
} 

这基本上赋予一个随机数(0和100之间),以每个问题,并通过数字进行排序。然后,您可以仅创建全局sortedArray(或者可能只是覆盖您的questions数组),并按顺序显示对象,并将对其进行混洗。

[btnA setTitle:[[[questions objectAtIndex:r] objectAtIndex:0] objectForKey:@"A"] forState:UIControlStateNormal];

您的代码来看,你可能需要修改几行:(但你也可以创建一个currentQuestionsArray和它上面的代码之前分配给[questions objectAtIndex:r]

for (int i=0; i < [questions count]; i++) { 
//to 
for (int i=0; i < [[questions objectAtIndex:r] count]; i++) {` 

[unorderedQuestions addObject:[[NSArray alloc] initWithObjects:[questions objectAtIndex:i], [NSString stringWithFormat:@"%i", rndValue], nil]]; 
//to 
[unorderedQuestions addObject:[[NSArray alloc] initWithObjects:[[questions objectAtIndex:r] objectAtIndex:i], [NSString stringWithFormat:@"%i", rndValue], nil]];` 

我认为这是最强大的解决方案,因为将来您可能会针对特定问题获得不同数量的答案,并且无需编辑即可这样做!

0

首先,你需要计算所有UIButtons意味着你需要多少按键使用那里,然后使用循环拉多姆顺序和使用标签,在每个button.`执行行动创造的UIButton

-(void)button:(id)sender { 
int btnn = 0; 
int spacex = 10; 
int spacey=20; 
int k=0; 
saveBtn = [[NSMutableArray alloc] init]; 
for (int i=0; i<96; i++) { 
    if (btnn>14) { 
      spacey=spacey+32; 
      spacex = 10; 
      btnn = 0; 
      } 
     else { 
      btnn++ ; 
      k++; 
      UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; 
      btn.frame = CGRectMake(spacex, spacey, 30.0, 32.0); 
      [btn setShowsTouchWhenHighlighted:YES]; 
      int idx; 
      idx = arc4random()%[arr count]; 
      NSString* titre1 = [arr objectAtIndex:idx]; 
      [btn setTitle: titre1 forState: UIControlStateNormal]; 
      [btn setBackgroundImage:[UIImage imageNamed:@"Orange.png"] forState:UIControlStateNormal]; 
      [btn setTitleColor: [UIColor blackColor] forState: UIControlStateNormal]; 
      [btn.titleLabel setFont:[UIFont fontWithName:@"TimesNewRomanPS-BoldMT" size:21.0]]; 
      spacex = spacex + 30; 
      btn.tag=k; 
      [btn addTarget:self action:@selector(aMethod:)forControlEvents:UIControlEventTouchUpInside]; 
      [saveBtn addObject:btn]; 
      [self.view addSubview:btn]; 
      } 
    } 

用上面的方法,我希望它会工作为你。如果您有任何疑问,然后让我know.Thanks

2

而不是通过重新创建按钮和定位他们,只是在固定位置的三个按钮并分配答案给他们随机。

你如何随机分配它们?你可以以随机顺序从数组中取出元素并分配它们,或者,你可以将数组随机移动,但总是让索引0处的对象出现在第一个按钮上,而索引2处的对象出现在第二个按钮上。 ,我认为这更容易。

你可以看到阵列的实现在这个问题洗牌What's the Best Way to Shuffle an NSMutableArray?

1

您可以将按钮的任何地方如通过将其中心属性设置为firstButton.center = newCenter;
我假设你已经在Interface Builder中创建了你的按钮。因此,你已经拥有了3个只需要随机置换的中心。用我称之为1,2和3的3个按钮,你有以下6种可能性:(123),(132),(213),(231),(312)和(321)。因此你必须随机选择6种可能性中的1种。 函数arc4random()生成一个随机整数。要获得0和x之一,必须致电arc4random() % (x+1)。您可以使用结果来选择正确的排列,例如在下面的代码示例:

商店第一的3个中心:

CGPoint center1 = myButton1.center; 
CGPoint center2 = myButton2.center; 
CGPoint center3 = myButton3.center; 

,并产生新的位置后:

int permutation = arc4random() % 6; 
switch (permutation) { 
    case 0: 
     myButton1.center = center1; 
     myButton2.center = center2; 
     myButton3.center = center3; 
     break; 
    case 1: 
     myButton1.center = center1; 
     myButton2.center = center3; 
     myButton3.center = center2; 
     break; 
    case 2: 
     myButton1.center = center2; 
     myButton2.center = center1; 
     myButton3.center = center3; 
     break; 
    case 3: 
     myButton1.center = center2; 
     myButton2.center = center3; 
     myButton3.center = center1; 
     break; 
    case 4: 
     myButton1.center = center3; 
     myButton2.center = center1; 
     myButton3.center = center2; 
     break; 
    case 5: 
     myButton1.center = center3; 
     myButton2.center = center2; 
     myButton3.center = center1; 
     break; 
    default: 
     break; 
} 
+0

虽然你的想法是合理的,但这是不可维护的,并不能扩展。你不需要移动按钮,只需要显示它们上的答案。 – Abizern

+1

可扩展性不是必需的。恰好有3个按钮。而且,我们不知道所有的按钮是否都一样。如果不是,重新定位它们可能比改变它们的属性更好。所以我不认为你的投票是合理的。 –