如果在x秒后没有按下按钮,请执行某些操作

时间:2013-12-27 05:11:37

标签: ios uibutton nsmutablearray slideshow nstimer

我有一个简单的幻灯片应用程序,以5秒的间隔显示图像。按下按钮可以按1-5的等级评定图像,评级存储在NSMutableArray(称为“额定”)。此时,每个按钮都使用switch语句存储在数组中。

- (IBAction)setRating:(id)sender
{
    UIButton *button = (UIButton *) sender;
    int bTag = button.tag;
    rating = [NSString stringWithFormat:@"%d", bTag];
    _ratingChoice.text = rating;

    // Determine which button was pressed, add to array
    switch (button.tag) 
    {
        case 1:
            [self.rated addObject:rating];
            NSLog(@"Rating 1 button pressed");
            break;

        ...

        case 5:
            [self.rated addObject:rating];
            NSLog(@"Rating 5 button pressed");
            break;
    }

如果在下一个图像显示之前5秒钟没有点击按钮,我需要以某种方式在数组中插入“Null”值。     我曾试图使用NSTimer,但似乎无法弄明白。我在按钮方法中包含了下面的代码,但它没有做任何事情。     (我是通过不按任何按钮测试它,希望在5秒后将“Null”添加到数组中)。     我在头文件中声明了NSTimer *clickTime;

    _clickTime = [NSTimer scheduledTimerWithTimeInterval:5 target:self 

    selector:@selector(ratingClicked:) userInfo:nil repeats:NO];
}


-(void)ratingClicked:(NSTimer*)clickTime
{
    [self.rated addObject:@"Null"];
    NSLog(@"Null added to array");
    NSLog(@"%@", self.rated);
}

另一个问题是,每个图像上可以多次按下任何按钮,从而导致向阵列添加更多值。我需要以某种方式限制每个图像的一个按钮点击。

我应该以某种方式实现允许每5秒点击一次按钮的方法吗?

我是否需要将我的数组更改为addObject:atIndex:作为我的两个问题的解决方案?谢谢!

3 个答案:

答案 0 :(得分:0)

你可以尝试这个我能够对按下的按钮做不同的动作:

- (void)viewDidLoad
{
  [super viewDidLoad];
  // Do any additional setup after loading the view from its nib.
  [self setTimer];
}

  //--> set your timer
  -(void)setTimer
 {
    self.mTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self 
    selector:@selector(btnNotPushed) userInfo:nil repeats:NO];
 }

  -(void)btnNotPushed
  {
    //--> do your stuff on button not clicked
    [self resetTimer];
    [self setTimer];
  }
   -(void)resetTimer
    {
     [ self.mTimer invalidate];
     self.mTimer = nil;
    }

   //--> your method on button tap;
   -(IBAction)pushClicked:(id)sender
   {
     [self resetTimer];
     [self setTimer];
    //-->do your stuff on button clicked;
   }

您将能够根据您的代码执行上述功能。

答案 1 :(得分:0)

在显示图像后立即添加此代码:

[self performSelector:@selector(ratingClicked:)
           afterDelay:5.0];

我还建议您将ratingClicked:方法的名称更改为ratingNotClicked

-(void)ratingNotClicked{
    [self.rated addObject:@"Null"];
    NSLog(@"Null added to array");
    NSLog(@"%@", self.rated);
}

通过调用performSelector:withObject:afterDelay:当显示图像时,您要求程序在5秒后添加“null”值。

如果已按下其中一个评级按钮,则可以使用cancelPreviousPerformRequestsWithTarget取消performSelector:withObject:afterDelay:请求:方法:

- (IBAction)setRating:(id)sender {
[self cancelPreviousPerformRequestsWithTarget:self
                                     selector:@selector(ratingClicked:)];
    UIButton *button = (UIButton *) sender;
    int bTag = button.tag;
    rating = [NSString stringWithFormat:@"%d", bTag];
    _ratingChoice.text = rating;

    // Determine which button was pressed, add to array
switch (button.tag) {
    case 1:
        [self.rated addObject:rating];
        NSLog(@"Rating 1 button pressed");
        break;

    ...

    case 5:
        [self.rated addObject:rating];
        NSLog(@"Rating 5 button pressed");
        break;
}

答案 2 :(得分:0)

仅提供建议,使用such control代替按钮点击可以提供更好的用户体验,而且也很容易管理。