显示定时器延迟的随机图像

时间:2014-01-01 21:17:09

标签: ios iphone objective-c xcode5

我正在制作一个应用程序,从预设的一组图片中随机选择一张图片并将其显示到图像视图中。这应该每隔一秒左右发生一次,直到它经历了20个循环。

听到我的标题和实现代码:

@interface spinController : UIViewController
{
IBOutlet UIImageView *imageHolder;
NSTimer *MovementTimer;    
}
-(IBAction)Button:(id)sender;
-(void)displayPic;
@end


@implementation spinController
-(IBAction)Button:(id)sender
{
int count = 0;
while (count <20)
{
   [NSTimer scheduledTimerWithTimeInterval:1 target:self    selector:@selector(displayPic) userInfo:nil repeats:NO];
    count++;
}
}
-(void)displayPic
{
int r = arc4random() % 2;
if(r==0)
{
imageHolder.image = [UIImage imageNamed:@"puppy1.jpg"];
}
else
{
imageHolder.image = [UIImage imageNamed:@"puppy2.jpg"];
}
}   
-(void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
}  
@end

我已经在WPF中以更高级的形式制作了这个应用程序,并遇到类似的问题,其中图片没有正确循环。如果我点击旋转它随机,但不会经历20个周期...只有一个。这是我在objective-c中的第一个应用程序,并且意识到我选择的方法的效率将决定我的应用程序以更复杂的形式运行的程度。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

问题是你在while循环中反复调用计时器;因为那个特殊的while循环将在一毫秒左右完成,你就会一个接一个地连续创建20个定时器。因此,只有最终图片会显示在imageHolder视图中。编辑:即使循环每次迭代花费超过一毫秒,我相信NSTimer实际上不会触发,直到该方法退出。

为了在您尝试时一个接一个地显示图像,(1)使用不带while循环的NSTimer,(2)使用count跟踪迭代 class 实例变量,以便在完成各种方法时不会丢失变量的值,并且(3)将NSTimer传递给displayPic方法,以便您可以在第20次迭代时从那里使计时器无效。例如:

// Declare the "count" instance variable.
int count;

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

-(IBAction)Button:(id)sender {
    // The count starts at 0, so initialize "count" to 0.
    count = 0;

    // Use an NSTimer to call displayPic: repeatedly every 1 second ("repeats" is set to "YES")
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(displayPic:) userInfo:nil repeats:YES];
}

// Pass along the NSTimer to the displayPic method so that it can be invalidated within this method upon the 20th iteration
-(void)displayPic:(NSTimer *)timer {

    // Get the random number
    int r = arc4random() % 2;

    // If the number is 0, display puppy1.jpg, else display puppy2.jpg.
    if(r == 0) {
        imageHolder.image = [UIImage imageNamed:@"puppy1.jpg"];
    }
    else {
        imageHolder.image = [UIImage imageNamed:@"puppy2.jpg"];
    }

    // Increment "count" to reflect the number of times the NSTimer has called this method since the button press
    count ++;

    // If the count == 20, stop the timer.
    if (count == 20)
        [timer invalidate];
}   

@end

答案 1 :(得分:0)

将重复更改为YES。这会导致计时器一次又一次地运行。然后,而不是while循环检查方法本身的计数。