如何调用数组值并使用它来播放声音文件?

时间:2009-07-31 19:28:04

标签: objective-c iphone

我有一个数组,按特定顺序创建几个不同的声音文件名。我已经成功创建了数组,但我不知道如何将从数组中获取的值作为文件URL调用,或者如何将其实现为AudioServicesPlaySystemSoundID。

这是我到目前为止的代码:

       - (void)viewDidLoad {
            NSArray *sounds = [[NSArray alloc] initWithObjects: @"0.wav", @"1.wav", @"2.wav, nil];
            NSUInteger currentSound = 0;
            soundArray = sounds
            [super viewDidLoad];
        }

        - (void) playFailSound {
            currentSound++;
            if (currentSound >= [sounds count]) {
                currentSound = 0;
            }
            [self playSoundWithFilename:[sounds objectAtIndex:currentSound]];
        }

我也不确定我需要在头文件中声明为什么要工作以及如何存储数组的值?

1 个答案:

答案 0 :(得分:0)

您是否在询问如何调用playFailSound:或者您是否在询问如何在头文件中声明声音数组以使其成为实例变量?

您遇到的第一个问题是,您在两种方法中为数组使用了不同的变量名称。在viewDidLoad中你正在使用soundArray,而在playFailSound中你正在使用声音。

在头文件中,您需要将数组声明为实例变量:

#import <UIKit/UIKit.h>

@interface MyObject : NSObject {
    NSArray *_sounds;    //declare the variables
    NSInteger _currentSound;  //this doesn't need to be unsigned, does it?

}

@property(nonatomic, retain) NSArray *sounds;  //property
@property(value) NSInteger currentSound;  //property


//method declarations 
- (void) playFailSound;    
- (void) playSoundWithFilename:(NSString *)fileName;

@end

你会注意到我在变量的名称中使用了下划线,但在属性中没有。这样,当您打算使用该属性时,您不会意外地使用该变量。

在您的实施文件中,您需要以下内容:

#import "MyObject.h"

@implementation MyObject

//synthesize the getters and setters,  tell it what iVar to use
@synthesize sounds=_sounds, currentSound=_currentSound; 

   - (void)viewDidLoad {
        NSArray *tempSounds = [[NSArray alloc] initWithObjects: @"0.wav", 
                                                            @"1.wav", 
                                                            @"2.wav, nil];
        self.currentSound = 0; //use the setter
        self.sounds = tempSounds; //use the setter 
        [tempSounds release]; //we don't need this anymore, get rid of the memory leak
        [super viewDidLoad];
    }

    - (void) playFailSound {
        self.currentSound=self.currentSound++; //use the getters and setters
        if (self.currentSound >= [self.sounds count]) {
            self.currentSound = 0;
        }
        [self playSoundWithFilename:[self.sounds objectAtIndex:self.currentSound]];
    }

    - (void) playSoundWithFilename:(NSString *)filename {
        //you fill this in
    }
@end

现在您需要做的就是从某个地方调用playFailSound,并填写实际播放声音的部分。

基本上,对于两个引用它们之间未传递的相同变量的方法,它需要是一个实例变量。

这是非常基本的东西,所以如果你没有得到我在这里解释的内容,我建议你重新阅读一些Apple的介绍材料。