Xcode从功能更新标签文本

时间:2015-07-01 13:22:53

标签: objective-c xcode macos

我在Xcode中遇到了一些Objective-c问题。我试图改编DiskArbitration框架中的一个例子,而且我遇到了问题。此示例在框架看到磁盘时设置回调。从回调中,我想更新标签。

-(void)diskAppearedCallback:(DADiskRef *)disk context:(void *)context{
    CFDictionaryRef description = DADiskCopyDescription(*disk);
    NSLog(@"Disk appeared: %@", description);

    NSString *spaceLeft = CFDictionaryGetValue(description, CFSTR("DADeviceModel"));

    NSLog(@"Disk Name: %@", CFDictionaryGetValue(description, CFSTR("DADeviceModel")));

    [labelSpaceLeft setStringValue:[NSString stringWithFormat: @"%@", spaceLeft]];


    CFRelease(description);
}

静态函数中的注释行是我尝试过的,但我得到了一个"使用未声明的标识符"错误。

我也尝试将函数转换为编译器可以使用的方法,但后来我不知道如何从顶部的DARegisterDiskAppearedCallback行正确调用它。

{{1}}

**更新:以下是项目的要点:https://gist.github.com/anonymous/cb1c5795536ca15ef4e3

1 个答案:

答案 0 :(得分:2)

好的,问题是你基本上混合C和Objective-C。回调函数diskAppearedCallback是一个C函数,不属于该类,即使它是在@implementation@end之间定义的。因此,它无权访问_labelSpaceLeft

要解决此问题,您需要使用回调函数来调用该类实例上的方法,因此在注册回调时,请在最后一个参数中传递实例。这正是回调函数中的上下文指针。

DARegisterDiskAppearedCallback(sessionDA,
     kDADiskDescriptionMatchVolumeMountable,
     diskAppearedCallback,
     self);    // HERE

然后回调函数中的context将是一个指向类实例的指针:

static void diskAppearedCallback(DADiskRef disk, void* context) {
    CFDictionaryRef description = DADiskCopyDescription(*disk);
    NSLog(@"Disk appeared: %@", description);

    NSString *spaceLeft = CFDictionaryGetValue(description, CFSTR("DADeviceModel"));

    NSLog(@"Disk Name: %@", CFDictionaryGetValue(description, CFSTR("DADeviceModel")));

    // HERE
    AVRecorderDocument *instance = (AVRecorderDocument *)context;
    [instance.labelSpaceLeft setStringValue:spaceLeft];


    CFRelease(description);
}