0

我正在尝试使用 AVAudioPlayer 作为助手编写自己的淡入和淡出。

我的问题是:我有两个同名的方法定义,但一个接受一个 int,另一个不接受参数。有没有办法让我告诉 NSTimer 打电话给哪个?无法真正理解文档:

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nstimer_Class/Reference/NSTimer.html

-(void) stopWithFadeOut 
{
if (_player.volume > 0.1) {
    [self adjustVolume:-.1];
    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(stopWithFadeOut) userInfo:NULL repeats:NO];
}
else {
    [self stop];
}
}

-(void) stopWithFadeOut:(NSString *)speed 
{
int incr = [speed intValue];
if (_player.volume > 0.1) {
    [self adjustVolume:-incr];
    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(stopWithFadeOut) userInfo:NULL repeats:NO];
}
else {
    [self stop];
}
}
4

2 回答 2

7

它们实际上有不同的名称。冒号很重要,因此第二种方法的名称(以及因此的参数@selector())是stopWithFadeOut:.*

那么,要创建计时器,您需要:

[NSTimer scheduledTimerWithTimeInterval:0.1 
                                 target:self 
                               selector:@selector(stopWithFadeOut:) 
                               userInfo:NULL                   //^ Note! Colon!
                                repeats:NO];

但是,这种方法是不正确的,因为 anNSTimer自身传递给了它的 action 方法;你不可能传入任意对象。这就是userInfo:参数的用途。您可以将一些对象附加到计时器,并使用该方法在操作方法中检索它userInfo,如下所示:

- (void)stopWithFadeOut: (NSTimer *)tim 
{
    NSString * speed = [tim userInfo];
    int incr = [speed intValue];
    if (_player.volume > 0.1) {
        [self adjustVolume:-incr];
        [NSTimer scheduledTimerWithTimeInterval:0.1 
                                         target:self 
                                       selector:@selector(stopWithFadeOut:) 
                                       userInfo:speed
                                        repeats:NO];
    }

(另请注意,这意味着您的第一个方法并不是真正正确的NSTimer操作方法,因为它没有NSTimer参数。)


*编译器不会让你在一个类中声明或定义两个同名的方法,并且参数类型不计入选择器的一部分,所以试图在一个类中创建-(void)dumblethwaite:(int)circumstance;和定义-(void)dumblethwaite:(NSString *)jinxopotamus;是行不通的。

于 2012-05-25T20:25:34.547 回答
0

所以这就是我想出的。谢谢乔希。

-(void) pauseWithFadeOut
{
NSNumber *incr = [[NSNumber alloc] initWithFloat:0.1];
while (_player.volume > 0.1) {
    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(fadeOut) userInfo:incr repeats:NO];
}
}
-(void)fadeOut: (NSTimer*) deleg
{   
int incr = (int) [deleg userInfo];
if (_player.volume > 0.1) {
    [self adjustVolume:-incr];
}

} 
-(void) pauseWithFadeOut:(NSString *)speed
{
NSNumber *incr = [[NSNumber alloc] initWithFloat:[speed floatValue]];
while (_player.volume > 0.1) {
    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(fadeOut) userInfo:incr repeats:NO];
}

[self pause];

}
-(void) stopWithFadeOut
{
NSNumber *incr = [[NSNumber alloc] initWithFloat:0.1];
while (_player.volume > 0.1) {
    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(fadeOut) userInfo:incr repeats:NO];
}
}
-(void) stopWithFadeOut:(NSString *)speed
{
NSNumber *incr = [[NSNumber alloc] initWithFloat:[speed floatValue]];
while (_player.volume > 0.1) {
    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(fadeOut) userInfo:incr repeats:NO];
}

[self stop];

}
于 2012-06-05T21:25:45.383 回答