1

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

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

这是我的问题:我希望在播放声音时显示“Ça joue Simone!...”的窗口中有一个TextField,而当声音播放完毕时什么也没有。

单击“里拉”按钮时,我想要的消息已成功显示,但即​​使在播放完声音后仍会停留在那里。

这就是为什么我想我对如何使用 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
4

2 回答 2

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

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

于 2011-02-03T13:33:46.563 回答
1

你忘记了委托:

@interface ControleurLecteur : NSObject <Son> {
}
于 2011-02-03T13:40:07.707 回答