Как заставить NSSound воспроизводить звук в определенном пользователем классе? - PullRequest
0 голосов
/ 08 апреля 2011

Этот вопрос от новичка Objective-C, поэтому, пожалуйста, потерпите меня. Я пытаюсь издавать звуки в своих классах и успешно использую NSBeep (), но не NSSound. Вот пример. Обратите внимание, что NSBeep(); и [[NSSound soundNamed:@"Frog"] play]; отлично работают в программе "main.m", но только NSBeep(); работает в классе SoundMaker. Любая помощь в обучении тому, как заставить NSSound работать, очень ценится.

main.m:

#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>
#import "SoundMaker.h"

int main() {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSLog(@"This is the main program.");
    NSBeep(); // Works fine.
    sleep(1);
    [[NSSound soundNamed:@"Frog"] play]; // Works fine.
    sleep(1);
    [SoundMaker makeSound]; // Only NSBeep() works.

    [pool drain];
    return 0;
}

SoundMaker.h:

#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>

@interface SoundMaker : NSObject
+(void) makeSound;
@end

SoundMaker.m:

#import "SoundMaker.h"

@implementation SoundMaker
+(void) makeSound
{
    NSLog(@"This is SoundMaker.");
    NSBeep(); // Works fine.
    sleep(1);
    [[NSSound soundNamed:@"Frog"] play]; // Doesn't work.
}
@end

Ответы [ 3 ]

1 голос
/ 08 апреля 2011

Итак, как уже отмечалось, решение состоит в том, чтобы добавить оператор sleep(...);, следующий за NSSound. Вот изменение в SoundMaker.m, которое работает:

#import "SoundMaker.h"

@implementation SoundMaker
+(void) makeSound
{
    NSLog(@"This is SoundMaker.");
    NSBeep(); // Works fine.
    sleep(1);
    [[NSSound soundNamed:@"Frog"] play]; // Works fine.
    sleep(1); // This added statement allows the preceding "play" message to work.
}
@end
0 голосов
/ 06 марта 2018

Большинство других ответов, хотя все в порядке, делают его более сложным, чем нужно.Все, что вам нужно, - это утверждение (в Objective-C), где вы хотите, чтобы звук воспроизводился:

[[NSSound soundNamed:@"Hero"] play];

Вы можете найти и проверить различные названия звуков в окне «Звук» в Системных настройках.

0 голосов
/ 08 апреля 2011

В Xcode, если вы устанавливаете точку останова, она срабатывает?

Я запустил только недавно, поэтому + (void) мне кажется странным;Книга, которую я использую только, преподает

- (return_variable)methodname

[Редактировать]

Я только что проверил ее, добавил

- (void)playFrog;

В мой интерфейс.

Затем я реализовал функцию

- (void)playFrog
{
[[NSSound soundName:@"Frog"] play];
}

Я вызывал ее из другого места в моем приложении, как

[self playFrog];

Это сработало.

[Edit 2]

После прочтения вашего кода я заметил, что вы не распределили / не запустили SoundMaker ...

Попробуйте

SoundMaker *mySoundMaker = [[SoundMaker alloc] init];
[mySoundMaker makeSound];
[mySoundMaker release];
...