【问题标题】:Fixing "Use of undeclared identifier 'NSPreferencePanesDirectory'"修复“使用未声明的标识符‘NSPreferencePanesDirectory’”
【发布时间】:2012-01-26 11:17:05
【问题描述】:

我的应用程序使用following code:

#if MAC_OS_X_VERSION_10_5 < MAC_OS_X_VERSION_MAX_ALLOWED
    NSArray *globalPreferencePanes = 
        NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory,
            NSAllDomainsMask, YES);        
#else
    NSArray *globalPreferencePanes = 
        [NSArray arrayWithObjects:@"/Library/PreferencePanes", 
            [@"~/Library/PreferencePanes" stringByExpandingTildeInPath], nil];
#endif
return globalPreferencePanes;

我正在编译它的项目是针对 10.5 Mac OSX SDK,其中NSPreferencePanesDirectory 不存在(它仅存在于 10.6+ 中)。正因为如此,我有 #if#else 来检查我们正在运行的 Mac OSX 版本,所以我知道我应该使用 NSPreferencePanesDirectory 还是手动给出首选项窗格的位置目录。

为了停止出现这种“使用未声明的标识符”错误,我应该进行哪些更改?

谢谢。

【问题讨论】:

    标签: objective-c macos cocoa


    【解决方案1】:

    #if 在编译时评估,而不是在运行时评估。您可能想要做的是使用当前的 SDK (10.7),并执行以下操作:

    NSArray *globalPreferencePanes;
    
    if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_6)
        globalPreferencePanes = NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory, NSAllDomainsMask, YES);        
    else
        globalPreferencePanes = [NSArray arrayWithObjects:@"/Library/PreferencePanes", [@"~/Library/PreferencePanes" stringByExpandingTildeInPath], nil];
    
        return globalPreferencePanes;
    

    确保将您的目标操作系统版本设置为 10.5,以便符号弱链接。否则,您可以下拉并使用 CoreServices 的FSFindFolder()

    NSMutableArray *globalPreferencePanes = [NSMutableArray array];
    FSRef foundRef;
    
    OSErr err = FSFindFolder(kLocalDomain, kPreferencePanesFolderType, false, &foundRef);
    
    if (err != noErr) {
        CFURLRef url = CFURLCreateFromFSRef(NULL, &fsRef);
        CFStringRef path = CFURLCopyPath(url);
        [globalPreferencePanes addObject:(id)path];
        CFRelease(path);
        CFRelease(url);
    }
    
    OSErr err = FSFindFolder(kUserDomain, kPreferencePanesFolderType, false, &foundRef);
    
    if (err != noErr) {
        CFURLRef url = CFURLCreateFromFSRef(NULL, &fsRef);
        CFStringRef path = CFURLCopyPath(url);
        [globalPreferencePanes addObject:(id)path];
        CFRelease(path);
        CFRelease(url);
    }
    
    return globalPreferencePanes;
    

    (未测试)

    【讨论】:

    • 这不是 100% 的解决方案,如果此解决方案不适合您,请在下面查看我的回答。我的代码仍然只是对 Wevah 的代码稍作修改。干杯。
    【解决方案2】:

    如果您使用的是 10.5.x,您仍然会收到错误消息,因为“NSPreferencePanesDirectory”不是已知符号。我帮朋友解决了这个问题,把osxsupport.m中的FindPrefsDir函数代码改成:

    char *FindPrefsDir(void)
    {
        char *resstr = NULL;
        NSArray *globalPreferencePanes;
    
        globalPreferencePanes = [NSArray arrayWithObjects:@"/Library/PreferencePanes", [@"~/Library/PreferencePanes" stringByExpandingTildeInPath], nil];
    
        if ([globalPreferencePanes count] > 0)
        {
            resstr = StringToChar([globalPreferencePanes objectAtIndex:0]) ;
        }
        return resstr;
    
    }
    

    感谢 Wevah 的代码建议,但它并没有直接为我工作。所以我稍微改了一下,我还在 10.5.x 上的朋友在那之后就可以完美地构建它了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多