2011-04-07 77 views
0

这个问题来自Objective-C新手,所以请耐心等待。我试图在我的课堂上发出声音,并且使用NSBeep()而不是NSSound成功。这是一个例子。请注意,NSBeep();[[NSSound soundNamed:@"Frog"] play];在“main.m”程序中正常工作,但只有NSBeep();可用于SoundMaker类。学习如何让NSSound工作的任何帮助非常感谢。如何让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 

回答

0

所以如前所述,该解决方案是在NSSound之后添加sleep(...);声明。下面是工程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

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

我最近才开始自己,所以+(void)看起来很奇怪,我现在用的书只教

- (return_variable)methodname 

[编辑]

我只是测试它,加入

- (void)playFrog; 

为了我的界面。

我那么实现的功能

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

我把它叫做从别的地方我的应用程序一样

[self playFrog];

这工作。

[编辑2]

再次阅读你的代码后,我发现你没有分配/初始化你SoundMaker ...

尝试

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

好的,你准备好了吗?我足够的一个新手,我不知道如何使用断点。相反,我在SoundMaker的NSSound声明后添加了一条NSLog语句,并开始听到声音。因此,我尝试了一个“睡觉(1)”声明,我们现在可以听到“青蛙”的声音!因此,所需要的就是遵循NSSound声明并带有“睡眠(1)”声明来使其工作。 – scolfax 2011-04-07 22:34:52

+0

谢谢你的意见。如上所述,您的建议引发的测试导致找到解决方案。顺便说一句,如果我理解的东西正确,因为“makeSound”消息引用类方法而不是实例方法(“+(void)”),我不认为有必要分配/ init。 – scolfax 2011-04-07 22:47:48

+0

啊,好的,所以+就像一个(C#)静态方法?很高兴知道 :) – NKCSS 2011-04-08 06:46:21

0

大多数其他的答案,同时还行,使它看起来复杂得多,它需要的。所有你需要的是,无论你想待产生的声音这一说法(在Objective-C):

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

你可以找到和在系统预置的声音窗口测试各种声音的名称。