我目前正在开发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];
}
问题是:
库导入功能在单独的程序中正常工作,但当我将代码放入SpeakHereController.mm
时,媒体选择器不再显示。
此外,如果我将showMediaPicker方法放在另一个类中并调用它,它也不起作用。
我发现它可能是相关的:
原始代码位于obj-C文件(xxx.m)中,现在它被转移到obj-C ++文件(xxx.mm)中。
我还将SpeakHereController.h
的基类从NSObject
修改为UIViewController<MPMediaPickerControllerDelegate>
,否则会抛出基类不包含所需委托的警告。但是在界面构建器中它仍然显示为对象(请参阅SpeakHere示例代码)。
将内置xxxViewController.m
文件转换为obj-C ++文件(.mm扩展名)似乎是违法的。在这种情况下,如果我尝试这样做,会出现很多错误。这是真的吗?如果是这样,如何在纯obj-C文件中包含C ++代码?
=============
那么在这种情况下如何让媒体选择器出现呢?任何见解将不胜感激。
非常感谢!
干杯,
曼卡
答案 0 :(得分:1)
为了
[self presentModalViewController:mediaPicker animated:YES];
要工作,自我需要成为一个viewcontroller。我担心您刚刚更改了基类以避免编译器错误,因为这表明您实际上并没有正确地实例化“自我”。
那么你如何初始化SpeakHereController?作为一个视图控制器,这通常是通过指定的初始化器,对于UIViewController当然是initWithNibName:bundle:
您可能会发现the documentation for UIViewController有帮助。
关于C ++问题。虽然您可以按照建议的方式混合使用objective-c和c ++,但我建议您将c ++代码封装在自己的类中,而不是将其包含在viewcontroller代码中。这将使其在未来更加可维护。