Это происходит потому, что position
является статической переменной, и вы всегда повышаете ее, но никогда не понижаете.
Вам нужно будет немного изменить логику в функции таймера - возможно, так;
Удалите статическую переменную position
из вашего источника (int position = 0;
)
- (NSInteger)positionFromPlaybackTime:(NSTimeInterval)playbackTime
{
NSInteger position = 0;
for (NSNumber *startsAt in shoutOutTimes)
{
if (playbackTime > [startsAt floatValue])
{
++position;
}
}
return position;
}
Добавьте статическую переменную (на самом деле переменная экземпляра будет чище, но эй, мы просто пытаемся получить еечтобы работать в данный момент):
NSTimeInterval lastCheckAt = -1.0;
Затем измените свой метод таймера на это:
- (void)timerAction:(NSTimer*)theTimer
{
int count = [shoutOutTimes count];
NSInteger position = [self positionFromPlaybackTime:self.player.currentPlaybackTime];
NSLog(@"position is at %d", position);
if (position > 0)
{
--position;
}
if (position < count)
{
NSNumber *timeObj = [shoutOutTimes objectAtIndex:position];
int time = [timeObj intValue];
NSLog(@"shout scheduled for %d", time);
NSLog(@"last check was at %g", lastCheckAt);
NSLog(@"current playback time is %g", self.player.currentPlaybackTime);
if (lastCheckAt < time && self.player.currentPlaybackTime >= time)
{
NSString *shoutString = [shoutOutTexts objectAtIndex:position];
NSLog(@"shouting: %@", shoutString);
CommentView *cview = [[CommentView alloc] initWithText:shoutString];
[self.player.view addSubview:cview];
[NSTimer scheduledTimerWithTimeInterval:4.0f target:self selector:@selector(removeView:) userInfo:cview repeats:NO];
}
}
lastCheckAt = self.player.currentPlaybackTime;
}