0

我正在尝试注册一个回调以发送到

AudioSessionAddPropertyListener

它会在音频属性发生更改时通知您(例如,拔下耳机)。

iOS 文档另一个论坛中,显示您可以将代码放在实现块之外,并使用调用来获取 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 受保护的错误消息。我相信有一种方法可以在没有桥接的情况下做到这一点,因为正如我所说,苹果示例以某种方式编译,但我看不出我在做什么不同

4

1 回答 1

1

Objective-C 实例变量是@protected默认的,所以你不能从类外部访问它们。

可以通过将实例变量声明为@public.

然而,推荐的解决方案是制作appSoundPlayera@property 并将其作为controller.appSoundPlayer.playing.

桥接演员看起来不错。

于 2013-08-20T17:57:50.053 回答