1

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

非常感激任何的帮助。

杰米

4

4 回答 4

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]];`

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

于 2013-02-04T13:25:31.470 回答
2

与其重新创建按钮并定位它们,只需将三个按钮放在固定位置并随机分配答案。

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

您可以在这个问题What's the Best Way to Shuffle an NSMutableArray?中看到数组改组的实现?

于 2013-02-04T10:06:28.050 回答
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;
}
于 2013-02-04T10:16:45.220 回答
0

首先,您需要计算所有 UIButtons 意味着您需要在那里使用多少个按钮,然后使用 for 循环以随机顺序创建 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];
            }
    }

使用上述方法,我希望它对你有用。如果你有任何疑问,请告诉我。谢谢

于 2013-02-04T09:58:46.577 回答