记住随机数组中的上一个输出

时间:2010-09-21 19:34:42

标签: iphone arrays nsarray

我有一个应用程序,其中列出了下面列出的代码,可以显示最终用户的随机问题。我试图弄清楚如何让用户能够在随机显示的数组中向后导航。例如,用户正在经历问题并意外地推进过去并想要返回,我希望他们能够只是简单地按下后退按钮。你能提供一些如何做到这一点的指导吗?非常感谢!!!

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

  myArray5= [NSArray arrayWithObjects:           
      @"Question 1",
      @"Question 2",
      @"Question 3",
      @"Question 4",
      nil];

  int chosen = arc4random() % [myArray5 count]; 
  NSString *item = [myArray5 objectAtIndex: chosen];
  label3.text = [NSString stringWithFormat: @"%@", item];
  label3.alpha = 0;
  label3.transform = CGAffineTransformIdentity;
  [UIView beginAnimations:nil context:NULL];
  [UIView setAnimationDuration:1.0];
  label3.alpha = 1;
  label3.transform = CGAffineTransformMakeScale(1, 1);
  [UIView commitAnimations];
  UITouch *touch = [[event allTouches] anyObject];
  if (touch.tapCount == 2) {
  }
}

3 个答案:

答案 0 :(得分:0)

当然,您可以创建一个NSMutableArray,它可以保护随机选择的问题的索引(选择的int)。您还可以查看UINavigationController,它提供了在一系列视图中向后导航的方法。 最后,您应该考虑封装您的问题逻辑。看起来您在一个类中同时拥有接口的代码和问题的代码。一旦你的应用程序变大,你就会遇到这种方法的问题。看看Model-View-Controllers.

的概念

答案 1 :(得分:0)

一种可能性是预先计算应用初始化时用户将被问到的问题的缺陷。然而,这意味着你会问的问题数量会有一个硬编码限制,或者如果你到达数组的末尾就会回到起点。我不熟悉Objective-C所以请耐心等待

const int NUM_QUEsTIONS = 1000; // Arbitrary number
int questions[NUM_QUESTIONS];

init()
{
    for (int i = 0; i < NUM_QUESTIONS; ++i)
    {
        questions[i] = RandomNumber();
    }
}

然后在你的事件处理程序中,你只需将一个计数器递增到这个数组中并提出这个问题。

对于无限问题,您应该使用双向链表。

答案 2 :(得分:0)

一些想法:

创意1.将所选问题的ID存储在一个额外的数组中。

创意2.随机化数组,然后逐步完成。

想法3.如果你想避免两次使用问题,你可以

  • 使用索引表示有多少问题可供选择
  • 基于该索引创建一个随机整数
  • 您在该随机位置显示存储在数组中的问题
  • 您将该位置的元素移动到最大索引
  • 减少最大索引

有点像这样:

  NSMutableArray *array = [NSMutableArray arrayWithObjects: @"a", @"b", @"c", @"d", @"e", @"f", nil];
 NSInteger maxIndex = [array count]-1;
 do {

  NSInteger randomIndex = arc4random() % (maxIndex+1);

  NSLog(@"%@", [array objectAtIndex:randomIndex]);
  [array exchangeObjectAtIndex:randomIndex withObjectAtIndex:maxIndex];
  maxIndex--;



 } while (maxIndex > -1);