iOS媒体选择器没有显示出来

时间:2011-03-07 09:45:58

标签: iphone c++ objective-c core-audio objective-c++

我目前正在开发iPhone上的音频应用程序。它基于Apple的SpeakHere示例代码以及来自iPod库的用户定义输入文件。

以下是按钮引发的事件:

- (IBAction) btn_PickSong_Clicked:(id)sender{

[self showMediaPicker]; 

//code importing tracks from library
}

在showMediaPicker方法中:

//Yup the program does reach this method but the picker does not show up    
- (void)showMediaPicker {

MPMediaPickerController* mediaPicker = [[[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic] autorelease];
mediaPicker.delegate = self;
[self presentModalViewController:mediaPicker animated:YES];
}

问题是:

  1. 库导入功能在单独的程序中正常工作,但当我将代码放入SpeakHereController.mm时,媒体选择器不再显示。

  2. 此外,如果我将showMediaPicker方法放在另一个类中并调用它,它也不起作用。

  3. 我发现它可能是相关的:

    1. 原始代码位于obj-C文件(xxx.m)中,现在它被转移到obj-C ++文件(xxx.mm)中。

    2. 我还将SpeakHereController.h的基类从NSObject修改为UIViewController<MPMediaPickerControllerDelegate>,否则会抛出基类不包含所需委托的警告。但是在界面构建器中它仍然显示为对象(请参阅SpeakHere示例代码)。

    3. 将内置xxxViewController.m文件转换为obj-C ++文件(.mm扩展名)似乎是违法的。在这种情况下,如果我尝试这样做,会出现很多错误。这是真的吗?如果是这样,如何在纯obj-C文件中包含C ++代码?

    4. =============

      那么在这种情况下如何让媒体选择器出现呢?任何见解将不胜感激。

      非常感谢!

      干杯,

      曼卡

1 个答案:

答案 0 :(得分:1)

为了

[self presentModalViewController:mediaPicker animated:YES];

要工作,自我需要成为一个viewcontroller。我担心您刚刚更改了基类以避免编译器错误,因为这表明您实际上并没有正确地实例化“自我”。

那么你如何初始化SpeakHereController?作为一个视图控制器,这通常是通过指定的初始化器,对于UIViewController当然是initWithNibName:bundle:

您可能会发现the documentation for UIViewController有帮助。

关于C ++问题。虽然您可以按照建议的方式混合使用objective-c和c ++,但我建议您将c ++代码封装在自己的类中,而不是将其包含在viewcontroller代码中。这将使其在未来更加可维护。