我正在为kAudioSessionProperty_AudioRouteChange添加一个Audio会话属性监听器,在回调中我想调用UIImagePickerController的takePicture函数。问题是我无法在回调中访问我的选择器。
我正在viewDidLoad中初始化我的选择器。我已经尝试将选择器声明为私有和公共对象,并使用picker或self.picker进行访问,但它总是给出“使用未声明的标识符”错误。我使用此代码添加侦听器:
AudioSessionInitialize(nil, nil, nil, nil);
AudioSessionSetActive(true);
AudioSessionAddPropertyListener(
kAudioSessionProperty_AudioRouteChange,
applicationAudioRouteDidChange,
self);
这是我的回调:
void applicationVolumeDidChange(void *inClientData,
AudioSessionPropertyID inID,
UInt32 inDataSize, const void *inData)
{
NSLog(@"Volume changed");
//[picker takePicture]; Error
}
我还声明了一个NSArray,看看这是否只是UIImagePickerController的问题,但数组也给出了同样的错误。
答案 0 :(得分:2)
AudioSessionAddPropertyListener()
的最后一个参数就在那里,所以你可以将任何你喜欢的内容传递给回调。
OSStatus AudioSessionAddPropertyListener (
AudioSessionPropertyID inID,
AudioSessionPropertyListener inProc,
void *inClientData
);
您正在传递自我,因此在回调中,void *inClientData
参数是指向 self 对象的指针。
如果self是UIImagePickerController的一个实例,那么
UIImagePickerController *picker = inClientData;
[picker takePicture];
答案 1 :(得分:1)
您的回调必须是C函数,而不是Objective-C方法。这些不兼容。请参阅this link。