我想熟悉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
答案 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> {
}