我正在尝试注册一个回调以发送到
AudioSessionAddPropertyListener
会在音频属性发生变化时通知您(例如,拔下耳机)。
在iOS docs和here in another forum中,显示您可以将代码放在实现块之外,并使用调用来获取ViewController,以便您可以访问实例变量。
一个简单的例子,就是这样:
#import "ViewController.h"
#import <MediaPlayer/MediaPlayer.h>
#import <Foundation/Foundation.h>
void audioRouteChangeListenerCallback (
void *inUserData,
AudioSessionPropertyID inPropertyID,
UInt32 inPropertyValueSize,
const void *inPropertyValue
) {
ViewController *controller = (ViewController *) inUserData;
}
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
@end
所以在回调中,它告诉我需要桥接调用以获取ViewController。如果我这样做,那么我就无法访问某些变量。奇怪的是,我已经下载了iOS样本(上面已链接),在这种情况下符合要求。我在这做错了什么?
如果我将呼叫桥接到获取控制器的实例,我将得到这个
ViewController *controller = (__bridge ViewController *) inUserData;
int isPlaying = controller->appSoundPlayer.playing;
我收到appSoundPlayer受保护的错误。我相信有一种方法可以在没有桥接的情况下做到这一点,因为正如我所说,苹果示例以某种方式编译,但我不知道我在做什么不同
答案 0 :(得分:1)
Objective-C实例变量默认为@protected
,所以你
无法从课外访问它们。
你可以通过将实例变量声明为@public
来解决此问题。
建议的解决方案是appSoundPlayer
@property
并将其作为controller.appSoundPlayer.playing
访问。
过桥演员看起来不错。