【问题标题】:What is the simplest method for reading user defaults in Cocoa/OSX?在 Cocoa/OSX 中读取用户默认值的最简单方法是什么?
【发布时间】:2015-05-20 06:06:18
【问题描述】:

我正在将一个简单的 unix 应用程序移植到 OSX,现在在 NSWindow 中使用 NSView 子类. 有三个颜色常量(此视图@interface 的成员),我不喜欢硬编码,而是可以定义为用户默认值(并在启动时加载)。这些是: a, bc, 都是 [NSColor colorWithDeviceRed: green: blue: alpha] 类型。 我正在尝试了解如何从用户默认文件中读取这些值,该文件可以手动写入,也可以通过默认值 em> 系统命令。还尽量避免深入研究 Preference Pane Controller、Color Wells 等。在 X11 中,这非常简单。我试图找出在 Cocoa 中实现它的最简单方法。它不适用于“AppStore”类型的应用程序。是否有此类代码或类似代码的任何工作示例-在网上找不到任何示例?提前致谢。

【问题讨论】:

    标签: objective-c macos cocoa


    【解决方案1】:

    您可能正在寻找NSUserDefaults 类。该文档有大量信息和programming guide

    【讨论】:

    • 感谢@DarkDust。我已经遇到过 programming guide(在某些搜索引擎中也称为“实现 iOS 设置包”),我发现它有点不一致,而且很难理解,但我一定错过了 NSUserDefaults 类参考,包括组织良好的相关信息。
    【解决方案2】:

    NSUserDefaults,是的...

    这是我使用的代码,我将颜色存储为逗号分隔的 rgb 值。

    - (id)getUserPref:(NSString *)aSelector
    {
       id returnVal = nil;
       NSString *val = [[NSUserDefaults standardUserDefaults] objectForKey:aSelector];
       NSArray *vals = [val componentsSeparatedByString:@","];
       float rgba[4];
       // brute force validation of string... funky but safe
       if ( [vals count] <= 4 )
       {
          for ( int idx = 0; idx < [vals count]; idx++ )
          {
             val = [vals objectAtIndex:idx];
             val = [val stringByTrimmingCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:@"01234567890."] invertedSet]];
    
             if ( [val length] )
             {
                rgba[idx] = [val floatValue];
                if ( rgba[idx] > 255 || rgba[idx] < 0 )
                   break;
    
                if ( [vals count] == 1 )
                {
                   returnVal = [[NSColor colorWithContrastWhite:rgba[0]/255.0 alpha:1.0] retain];
                   return returnVal;
                }
                else if ( idx == 2 && [vals count] == 3 )
                {
                   returnVal = [[NSColor colorWithContrastRed:rgba[0]/255.0 green:rgba[1]/255.0 blue:rgba[2]/255.0 alpha:1.0] retain];
                   return returnVal;            
                }
                else if ( idx == 3 && [vals count] == 4 )
                {
                   returnVal = [[NSColor colorWithContrastRed:rgba[0]/255.0 green:rgba[1]/255.0 blue:rgba[2]/255.0 alpha:rgba[3]/255.0] retain];
                   return returnVal;            
                }         
             }
          }
       }
    
       DLogErr(@"bad BGThemeMbox user pref %@", aSelector);
    
       return nil; // better have a fallback color
    }
    

    【讨论】:

    • 感谢@Keith Knauber 的回答,这似乎是一个很有教育意义的代码sn-p,值得学习!
    【解决方案3】:

    尝试阅读 Apple 的 Storing NSColor in User Defaults,它连同 NSUserDefaults 的文档应该可以回答大多数问题。您会发现您甚至可以将颜色池的值直接绑定到用户默认值,因此您可能根本不需要避开它们。

    HTH

    【讨论】:

    • @CRD,我已经仔细阅读了。我知道这是在 OSX 应用程序中实现全彩支持的正确方法。为了简单起见,不幸的是,我的应用程序的运行时条件不允许这样做。这就是为什么我不得不选择最简单的解决方案。不过还是谢谢!
    • @user3078414:这可能在用户默认值中支持颜色的最简单方法。哪些“运行时条件”不允许您这样做?
    • 感谢您的友好评论@DarkDust。我担心跑题,但仅供参考,该应用程序实际上是由另一个进程通过套接字“启动和停止”的,所以当它启动时,它已经必须按应有的方式出现并完成它的工作。因此,可配置的用户默认值必须已经以一种或另一种方式存在于明显的位置。我已经测试了 Keith Knauber 的回复,它最接近我正在寻找的简单性。请不要介意重复我自己,以防它不够清楚,问题是不是关于 AppStore 级应用程序中的全彩支持。再次感谢!
    猜你喜欢
    • 2010-09-25
    • 2019-02-17
    • 2020-12-13
    • 1970-01-01
    • 2014-10-24
    • 2020-01-18
    • 2015-08-22
    • 2011-12-11
    • 2018-09-27
    相关资源
    最近更新 更多