如何让NSSound在用户定义的类中播放声音?

时间:2011-04-07 22:06:47

标签: objective-c nssound

这个问题来自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 个答案:

答案 0 :(得分:1)

如上所述,解决方案是在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

答案 1 :(得分:0)

在Xcode中,如果你设置一个断点,它会被击中吗?

我最近才开始自己,所以+(虚空)对我来说很奇怪;我正在使用的书只教导

- (return_variable)methodname

[编辑]

我刚测试过,添加了

- (void)playFrog;

到我的界面。

然后我实现了函数

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

我从我的应用程序中的其他位置调用它,如

[self playFrog];

那很有效。

[编辑2]

再次阅读你的代码之后,我注意到你没有分配/初始化你的SoundMaker ......

尝试

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

答案 2 :(得分:0)

大多数其他答案,虽然没问题,但它看起来比它需要的更复杂。您只需要在声明产生的任何地方生成声明(在Objective-C中):

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

您可以在“系统偏好设置”的“声音”窗口中找到并测试各种声音名称。