1

我正在制作一个根据视图控制器的选择播放声音文件的应用程序。我有一个将弹出的视图控制器,它显示一个带有城市名称、描述、图片和一个应该播放简单声音的按钮的视图。在下面的示例中,它将播放一个名为“slang4”的声音文件。这是实现文件中我的按钮的代码:

- (IBAction)soundButton:(id)sender{ 


    CFBundleRef mainBundle=CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef=CFBundleCopyResourceURL(mainBundle, (CFStringRef)@"slang4", CFSTR("mp3"),NULL);
    UInt32 soundID;
   AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
   AudioServicesPlaySystemSound(soundID);

}

问题是我希望按钮根据原始视图控制器(城市列表)的选择播放不同的声音。

例如,我的应用程序委托实现文件中的以下代码显示了每个城市如何拥有不同的声音文件:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    City *london = [[City alloc]init];
    london.cityName = @"London";
    london.cityDescription = @"The cap of UK.";
    london.cityPicture = [UIImage imageNamed:@"London.jpg"];
    london.soundFile=@"slang4.mp3";

    City *sanFranciso = [[City alloc]init];
    sanFranciso.cityName = @"San Francisco";
    sanFranciso.cityDescription=@"City by the Bay";
    sanFranciso.cityPicture = [UIImage imageNamed:@"SanFranciso.jpg"];
    sanFranciso.soundFile=@"babymama.mp3";

我的问题是我希望按钮能够知道根据城市播放哪个声音文件。我已经自学 iOS 编程大约 8 个月了,但我仍然是初学者。希望这是有道理的。

4

1 回答 1

0

听起来您的视图控制器City上已经有一个属性,因此在您的按钮操作中,您应该能够使用该soundFile属性中的声音文件。使用 的componentsSeparatedByString:方法NSString分为名称和扩展名。我认为您也可以只传递完整的文件名本身并NULL作为扩展名。此解决方案假定为 ARC。

NSArray *soundFileComponents = [self.city.soundFile componentsSeparatedByString:@"."];
if ([soundFileComponents count] == 2) {
    NSString *fileName = soundFileComponents[0];
    NSString *fileExtension = soundFileComponents[1];
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    if (mainBundle) {
        CFURLRef soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (__bridge CFStringRef)fileName, (__bridge CFStringRef)fileExtension, NULL);
        if (soundFileURLRef) {
            UInt32 soundID;
            OSStatus resultCode = AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
            if (resultCode == kAudioServicesNoError) {
                AudioServicesPlaySystemSound(soundID);
            }
            else {
                NSLog(@"error creating system sound ID: %ld", resultCode);
            }
            CFRelease(soundFileURLRef);
        }
        else {
            NSLog(@"error loading sound file URL");
        }
    }
    else {
        NSLog(@"error loading main bundle");
    }
}
else {
    NSLog(@"error splitting filename into name and extension");
}
于 2013-03-26T17:37:42.233 回答