在 Cocoa/OSX 中读取用户默认值的最简单方法是什么?
What is the simplest method for reading user defaults in Cocoa/OSX?
我正在移植到 OSX 一个简单的 unix 应用程序,现在使用 NSView NSWindow 中的子类。
有三个颜色常量(此视图@interface 的成员)我不喜欢硬编码,而是可定义为用户默认值(并在启动时加载)。这些是:
a, b 和 c, 都是 [NSColor colorWithDeviceRed: green: blue: alpha] 类型。
我正在尝试了解如何 从用户默认文件 中读取这些值,可以手动或通过默认系统命令。还试图远离深入研究首选项窗格控制器、颜色井等。在 X11 中,这非常简单。我试图找出在 Cocoa 中实现它的最简单方法。它不适用于 "AppStore" 类型的应用程序。是否有此类代码或类似代码的任何工作示例 - 在网上找不到任何示例?提前致谢。
您可能正在寻找 NSUserDefaults class. The documentation has plenty of information and a programming guide。
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
}
尝试阅读 Apple 的 Storing NSColor in User Defaults, that along with the documentation for NSUserDefaults
应该可以回答大多数问题。您会发现您甚至可以将颜色井的值直接绑定到用户默认值,因此您可能根本不需要避开它们。
HTH
我正在移植到 OSX 一个简单的 unix 应用程序,现在使用 NSView NSWindow 中的子类。 有三个颜色常量(此视图@interface 的成员)我不喜欢硬编码,而是可定义为用户默认值(并在启动时加载)。这些是: a, b 和 c, 都是 [NSColor colorWithDeviceRed: green: blue: alpha] 类型。 我正在尝试了解如何 从用户默认文件 中读取这些值,可以手动或通过默认系统命令。还试图远离深入研究首选项窗格控制器、颜色井等。在 X11 中,这非常简单。我试图找出在 Cocoa 中实现它的最简单方法。它不适用于 "AppStore" 类型的应用程序。是否有此类代码或类似代码的任何工作示例 - 在网上找不到任何示例?提前致谢。
您可能正在寻找 NSUserDefaults class. The documentation has plenty of information and a programming guide。
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
}
尝试阅读 Apple 的 Storing NSColor in User Defaults, that along with the documentation for NSUserDefaults
应该可以回答大多数问题。您会发现您甚至可以将颜色井的值直接绑定到用户默认值,因此您可能根本不需要避开它们。
HTH