iOS - 在实现范围之外编写回调

时间:2013-08-20 17:33:52

标签: ios objective-c

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

AudioSessionAddPropertyListener

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

iOS docshere 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受保护的错误。我相信有一种方法可以在没有桥接的情况下做到这一点,因为正如我所说,苹果示例以某种方式编译,但我不知道我在做什么不同

1 个答案:

答案 0 :(得分:1)

Objective-C实例变量默认为@protected,所以你 无法从课外访问它们。

可以通过将实例变量声明为@public来解决此问题。

建议的解决方案是appSoundPlayer @property 并将其作为controller.appSoundPlayer.playing访问。

过桥演员看起来不错。