我创建了吸引了来自一个plist中的问题到一个数组中,并显示在一个UILabel和uibuttons三个可能的答案的问题进行测验。 我的问题是我怎么可以创建按钮以随机的顺序,以使三个答案并不总是以相同的顺序显示出来?
非常感激任何的帮助。
杰米
我创建了吸引了来自一个plist中的问题到一个数组中,并显示在一个UILabel和uibuttons三个可能的答案的问题进行测验。 我的问题是我怎么可以创建按钮以随机的顺序,以使三个答案并不总是以相同的顺序显示出来?
非常感激任何的帮助。
杰米
与@ 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处的对象出现在第一按钮和第二按钮等在索引2 apear对象,我认为这是比较容易。
你可以看到阵列的洗牌在这个问题上的实现什么是随机播放一个NSMutableArray的最佳方式?
您可以在任何场合下,例如通过设置其中心属性按钮firstButton.center = newCenter;
。
我假设你已经创建了按钮在界面生成器。 因此,你已经在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;
}
首先,你需要计算所有UIButtons意味着你需要多少按键使用那里,然后使用循环拉多姆为了创造的UIButton和使用标签,在每个button.`执行操作
-(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