1

MacOSXでのObjectiveC/InterfaceBuilderプログラミングに精通したいと思います。私は通常サウンドを扱っているので、NSSoundクラスを使用して単純なオーディオプレーヤーをコーディングしようとしています。

「インポート」ボタンをクリックしてサウンドをロードし、「Lire」ボタンをクリックしてサウンドを再生する基本的なアプリケーションを作成することができました。

これが私の問題です。サウンドの再生時に「ÇajoueSimone!...」を表示し、サウンドの再生が終了すると何も表示しないTextFieldをウィンドウに表示したいと思います。

「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
4

2 に答える 2

1

デリゲートを忘れました:

@interface ControleurLecteur : NSObject <Son> {
}
于 2011-02-03T13:40:07.707 に答える
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 に答える