Цель C: Непонимание с методом делегата didFinishPLaying - PullRequest
1 голос
/ 03 февраля 2011

Я хочу познакомиться с программированием Objective C / Interface Builder на Mac OSX.Я обычно работаю со звуками, поэтому я пытаюсь кодировать простой аудиоплеер, используя класс NSSound.

Мне уже удалось создать базовое приложение, которое загружает звук, нажав кнопку «Импортер»и затем воспроизведите его, нажав кнопку «Lire».

Вот моя проблема: я хочу иметь TextField в окне, которое отображает «ja joue Simone! ...» при воспроизведении звука,и ничего, когда закончится воспроизведение звука.

При нажатии кнопки «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 ]

1 голос
/ 03 февраля 2011

Вы забыли делегата:

@interface ControleurLecteur : NSObject <Son> {
}
1 голос
/ 03 февраля 2011

Вы должны установить делегат 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

Большинство известных мне разработчиков предпочитают писать код полностью на английском языке, поскольку почти во всех языках программирования используются ключевые слова на английском языке, имена классов и т. Д., А сочетание их родных языков с английским просто затрудняет чтение.

...