【问题标题】:xcode do a random methodxcode 做一个随机的方法
【发布时间】:2011-05-04 16:12:29
【问题描述】:

大家好,我是法国人,所以请原谅我的英语。那么我想做的是每一秒我在四种方法之间做一个随机方法。请问我该怎么做?

【问题讨论】:

    标签: iphone xcode animation random methods


    【解决方案1】:

    你想要一个 1 到 4 之间的随机整数,然后是一个 case 语句来执行相应的选择器,对吧?

    【讨论】:

    • int randomNumber = 1+ arc4random() %(4);得到数字 [1,4]
    • an 那么如何执行对应的选择器呢?
    • 您需要一个 NSTimer,它每秒执行一个带有“case randomNumber”语句的方法,其中四个选择器作为选项。
    【解决方案2】:

    4 个字符串的数组(方法的名称),生成 0 到 3 之间的随机 int 然后使用 NSSelectorFromString 调用。

    【讨论】:

      【解决方案3】:

      例如你有四种方法:

      //put them on array as strings
      NSArray *arrayOfSelectors = [NSArray arrayWithObjects:@"eat", @"drink", @"run", @"sleep", nil];
      
      //generate a random number based on the number of selectors inside the array
      int randomNumber = arc4random()%arrayOfSelectors.count;
      
      //call the method
      //assumes that someObject really implement the methods inside the array, else your app will crash
      [someObject performSelector:NSSelectorFromString([arrayOfSelectors objectAtIndex:randomNumber])];
      
      1. -(无效)吃;
      2. -(无效)喝;
      3. -(无效)运行;
      4. -(无效)睡眠;

      【讨论】:

      • 然后....没有 if(randomNumber=1) 或类似的东西,调用附加到数字的方法
      • 他的回答是 OK Arvin,它确实随机调用了其中一种方法。将其复制到 XCode 并 Cmd+单击方法以查看其文档。
      • 但是我们如何使用这些数字来调用方法。这就是我的问题所在。
      【解决方案4】:

      你需要启动计时器的地方

      [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(randomMethod:) userInfo:nil repeats:YES];
      

      然后实现将要调用的方法:

      -(void)randomMethod:(NSTimer *)timer {
      
          if (shouldStop) {
              [timer invalidate];
              return;
          } 
      
          int rand = arc4random() % 4;
      
          switch (rand) {
              case 0: 
                  [self method0];
                  break;
              case 1:
                  [self method1];
                  break;
              case 2:
                  [self method2];
                  break;
              case 3:
                  [self method3];
                  break;
          }
      }
      

      稍后,如果您想停止它,请将 shouldStop 设置为 true。

      【讨论】:

      • 好的,但是我的方法为球设置了动画,它们都在同一个主循环中,CadisplayLink 为 60fps。
      • 在某些时候,您需要学会自己解决问题。我已经为您提供了计时器代码、随机代码和 switch 语句代码。这就是你的问题。如果您还有其他问题,请将它们作为不同的问题提出。
      • 只是最后一个问题,我们可以在哪里以及如何使 shouldStop 变为 true。
      • 任何你想要的地方。每当您想停止计时器时,都应将其设置为 true,无论是按下另一个按钮,触发事件后,还是使用另一个计时器调用方法在一定时间后停止它。
      • 是否可以暂时停止它并在另一个点重新启动它
      【解决方案5】:

      首先创建计时器:

      NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 1.0
                                                    target: self
                                                  selector:@selector(selectorSwitcher:)
                                                  userInfo: nil repeats:YES];
      NSRunLoop *runner = [NSRunLoop currentRunLoop];
      [runner addTimer:t forMode: NSDefaultRunLoopMode];
      

      然后实现切换器:

      -(void)selectorSwitcher:(NSTimer *)timer {
      
          int randomNumber = 1+ arc4random() %(4);
          switch (randomNumber) {
              case 1:
                  [self selector1];
                  break;
              case 2:
                  [self selector2];
                  break;
              case 3:
                  [self selector3];
                  break;
              case 4:
                  [self selector4];
                  break;
      
              default:
                  break;
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-23
        • 2011-02-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多