我已经创建了一个测验,它从plist中将问题绘制到数组中,并在uilabel中显示问题,并在uibutton中显示三个可能的答案。我的问题是,如何为按钮创建随机顺序,以便三个答案不总是以相同的顺序显示?按钮的随机顺序
任何帮助将不胜感激。
杰米
我已经创建了一个测验,它从plist中将问题绘制到数组中,并在uilabel中显示问题,并在uibutton中显示三个可能的答案。我的问题是,如何为按钮创建随机顺序,以便三个答案不总是以相同的顺序显示?按钮的随机顺序
任何帮助将不胜感激。
杰米
与@ 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]];`
我认为这是最强大的解决方案,因为将来您可能会针对特定问题获得不同数量的答案,并且无需编辑即可这样做!
首先,你需要计算所有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
而不是通过重新创建按钮和定位他们,只是在固定位置的三个按钮并分配答案给他们随机。
你如何随机分配它们?你可以以随机顺序从数组中取出元素并分配它们,或者,你可以将数组随机移动,但总是让索引0处的对象出现在第一个按钮上,而索引2处的对象出现在第二个按钮上。 ,我认为这更容易。
你可以看到阵列的实现在这个问题洗牌What's the Best Way to Shuffle an NSMutableArray?
您可以将按钮的任何地方如通过将其中心属性设置为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;
}
虽然你的想法是合理的,但这是不可维护的,并不能扩展。你不需要移动按钮,只需要显示它们上的答案。 – Abizern
可扩展性不是必需的。恰好有3个按钮。而且,我们不知道所有的按钮是否都一样。如果不是,重新定位它们可能比改变它们的属性更好。所以我不认为你的投票是合理的。 –
你是如何存储你的选择与正确答案 –
我存储选项加入到我的按钮,这样 '[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; }' –