目标C:使用didFinishPLaying委托方法的误解

时间:2011-02-03 13:22:38

标签: objective-c nssound

我想熟悉mac OSX上的Objective C / Interface Builder编程。我通常使用声音,所以我正在尝试使用NSSound类编写一个简单的音频播放器。

我已经设法创建了一个基本应用程序,通过单击“导入器”按钮加载声音,然后单击“Lire”按钮播放它。

这是我的问题:我希望窗口中有一个TextField,当播放声音时显示“ÇajoueSimone!...”,声音播放完毕时没有任何内容。

单击“Lire”按钮时,我想要的信息已成功显示,但即​​使声音播放完毕,它也会保留在那里。

这就是为什么我猜我对如何使用didFinishPLaying委托方法有误解。

有人有提示吗?

//
//  ControleurLecteur.h
//  LecteurSon
//

#import <Cocoa/Cocoa.h>


@interface ControleurLecteur : NSObject {
    NSSound *son ;
    IBOutlet NSTextField *infoTextField ;
    IBOutlet NSTextField *cheminField ;
    IBOutlet NSTextField *durationField ;
}

-(IBAction)lireSon:(id)sender ;  
-(IBAction)importerSon:(id)sender ;  
-(IBAction)son:(NSSound *)son didFinishPlaying:(BOOL)bienjoue;  

@end

//
//  ControleurLecteur.m
//  LecteurSon
//


#import "ControleurLecteur.h"


@implementation ControleurLecteur

-(IBAction)importerSon:(id)sender { 
    NSString *Chemin = [[NSString alloc] initWithString:(NSString *)@"epno"] ;

    son = [[NSSound soundNamed:Chemin] retain];

    // Limiter l'affichage de la durée à 3 chiffres après la virgule
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
    [numberFormatter setMaximumFractionDigits:3];
    [[durationField cell] setFormatter:numberFormatter];

    // Remplissage du champ de texte durée
    [durationField setFloatValue:[son duration]] ;  
}

-(IBAction)lireSon:(id)sender {

    BOOL bienjoue;
    bienjoue = [son play];
    bienjoue = TRUE;
    [infoTextField setStringValue:@"Ça joue Simone !..."];
    son:didFinishPlaying:bienjoue;
}


-(IBAction)son:(NSSound *)son didFinishPlaying:(BOOL)bienjoue {
    [infoTextField setStringValue:@""] ;
}


@end

2 个答案:

答案 0 :(得分:1)

创建后,您必须设置son的委托:

son = [[NSSound soundNamed: Chemin] retain];
[son setDelegate: self];

否则,son不知道在哪里发送其委托消息。

您还必须注意保留委托邮件的英文名称。如果你把它们翻译成法语,它们将不会被Objective-C理解(参数的名称可以是任何东西。)而不是:

-(IBAction)son:(NSSound *)son didFinishPlaying:(BOOL)bienjoue

使用:

-(void)sound:(NSSound *)son didFinishPlaying:(BOOL)bienjoue

我认识的大多数开发人员都选择完全用英语编码,因为几乎所有编程语言都使用基于英语的关键字,类名等,并且将他们的母语与英语相结合往往会造成难以阅读的混乱。

答案 1 :(得分:1)

你忘了代表:

@interface ControleurLecteur : NSObject <Son> {
}