我创建了一个测验,将问题从一个plist中提取到数组中,并在uilabel中显示问题,并在uibutton中显示三个可能的答案。我的问题是如何为按钮创建一个随机顺序,以便三个答案不会总是以相同的顺序显示?
非常感谢任何帮助。
杰米
答案 0 :(得分: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]];`
我认为这是最强大的解决方案,因为将来您可能会针对特定问题获得不同数量的答案,而不需要对此进行编辑!
答案 1 :(得分:2)
不是通过重新创建按钮并定位它们,而是在固定位置放置三个按钮并随机分配它们。
你如何随意分配它们?您可以以随机顺序从数组中取出元素并分配它们,或者,您可以只是对数组进行洗牌,但始终在第一个按钮上出现索引0处的对象,在第二个按钮上出现索引2处的对象等,我认为这更容易。
中看到数组混洗的实现答案 2 :(得分:1)
您可以将按钮放在任何位置,例如通过firstButton.center = newCenter;
设置其中心属性
我假设您已在Interface Builder中创建了按钮。因此,您已经有3个中心,只需要随机置换。使用3个按钮,我称之为1,2和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;
}
答案 3 :(得分:0)
首先你需要计算你的所有UIButtons意味着需要在那里使用多少个按钮,然后使用for循环以radom顺序创建uibutton并使用tag对每个按钮执行操作。
-(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];
}
}
使用上面的方法我希望它对你有用。如果您有任何疑问,请告诉我。谢谢