0

AVAudioPlayer をヘルパーとして使用して、独自のフェードインとフェードアウトを作成しようとしています。

私の問題は次のとおりです。同じ名前のメソッド定義が 2 つありますが、1 つは int を取り、もう 1 つはパラメータを取りません。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

それらは実際には異なる名前を持っています。コロンは意味があるので、2 番目のメソッドの名前 (したがって への引数@selector()) はstopWithFadeOut:.*です。

タイマーを作成するには、次のようにします。

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

ただし、このメソッドは正しくありません。なぜなら、は自身をそのアクション メソッドにNSTimer渡すからです。任意のオブジェクトを渡すことはできません。これがパラメータの目的です。次のように、オブジェクトをタイマーにアタッチし、メソッドを使用してアクション メソッド内で取得することができます。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ください。)


*コンパイラでは、1 つのクラスで同じ名前の 2 つのメソッドを宣言または定義することはできません。また、パラメーターの型はセレクターの一部としてカウントされないため、1 つのクラスで-(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 に答える