Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 当双击标题栏时,如何知道窗口是否可最小化?_Objective C_Cocoa_Window_Nsuserdefaults - Fatal编程技术网

Objective c 当双击标题栏时,如何知道窗口是否可最小化?

Objective c 当双击标题栏时,如何知道窗口是否可最小化?,objective-c,cocoa,window,nsuserdefaults,Objective C,Cocoa,Window,Nsuserdefaults,此图像来自系统首选项>外观 我想知道如何通过编程获得该值 我这样问是因为我正在用自定义标题栏绘制一个窗口,我希望它(在行为上)尽可能类似于正常(非自定义)的cocoa窗口 也许我可以使用一个终端命令,或者有一个cocoa API来实现这一点 编辑: 回答(感谢上帝) 后来我发现外观(水/石墨)可以找到: NSString * const kAppleAquaColorVariant = @"AppleAquaColorVariant"; NSUserDefaults *userDefaults

此图像来自系统首选项>外观

我想知道如何通过编程获得该值

我这样问是因为我正在用自定义标题栏绘制一个窗口,我希望它(在行为上)尽可能类似于正常(非自定义)的cocoa窗口

也许我可以使用一个终端命令,或者有一个cocoa API来实现这一点

编辑:

回答(感谢上帝)

后来我发现外观(水/石墨)可以找到:

NSString * const kAppleAquaColorVariant = @"AppleAquaColorVariant";
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// [userDefaults addSuiteNamed:NSGlobalDomain]; // unnecessary  
NSNumber *color = [userDefaults objectForKey:kAppleAquaColorVariant];
if ([color intValue] == 6) {//graphite is 6 
    imageName = [imageName stringByAppendingFormat:@"_graphite"];
}else{//defaults to aqua, (aqua is 1)
    imageName = [imageName stringByAppendingFormat:@"_colorsryg"];
}

这也很有帮助:)

我的方法可能是从用户默认值中读取值

NSString * const MDAppleMiniaturizeOnDoubleClickKey = @"AppleMiniaturizeOnDoubleClick";

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// [userDefaults addSuiteNamed:NSGlobalDomain]; // unnecessary

NSNumber *miniaturize = [userDefaults
                     objectForKey:MDAppleMiniaturizeOnDoubleClickKey];

NSLog(@"AppleMiniaturizeOnDoubleClick == %@",
                ([miniaturize boolValue] ? @"YES" : @"NO"));
(此首选项设置存储在~/Library/Preferences/文件夹中不可见的
.GlobalPreferences.plist
中)

请注意,默认情况下,“双击以最小化”选项处于禁用状态,因此,如果您检查是否存在
AppleMiniaTurbleClick
并返回nil,则表示该选项处于禁用状态。(只有当值与默认值不同时,用户默认值才会开始存储值)

这把钥匙在豹子身上和在雪豹身上是一样的。(狮子和山狮也没有变化)

当然,在
NSWindow
中有一个秘密(私有)方法,
-(BOOL)\u应该双击
,但我不建议使用私有方法


[更新]关于Catfish_-Man的评论:您的回答是正确的,
[userDefaults addSuiteNamed:NSGlobalDomain]是不必要的,因为NSUserDefaults已经能够读取全局首选项。(我修改了上述代码以反映这一点)

“此外,
NSGlobalDomain
未转换为 .GlobalPreferences.plist以获取该方法。”

我不确定我是否能跟上你。NSUserDefaults构建在CFPreferences之上,CFPreferences定义了以下6个常量:

应用程序:

 kCFPreferencesAnyApplication,
 kCFPreferencesCurrentApplication
主持人:

用户:

给定一个虚构的应用程序包标识符“com.markdouma.App”和一台主机(基于您当前的网络位置,在本例中不会更改),通常有8个位置可以将首选项信息存储在磁盘上。(注意:显示的路径仅用于演示;确切的文件路径位置可能会更改)。8个不同的位置由CFPreferences常量的不同组合产生:

/Library/Preferences/.GlobalPreferences.plist
(kCFPreferencesAnyApplication、kCFPreferencesAnyUser、kCFPreferencesAnyHost)

/Library/Preferences/com.markdouma.App.plist
(kCFPreferencesCurrentApplication,kCFPreferencesAnyUser,
kCFPreferencesAnyHost)

/库/Preferences/ByHost/.GlobalPreferences.UNIQUE_HOST_IDENTIFIER.plist
(kCFPreferencesAnyApplication、kCFPreferencesAnyUser、kCFPreferencesCurrentHost)

/Library/Preferences/ByHost/com.markdouma.App.UNIQUE_HOST_IDENTIFIER.plist
(kCFPreferencesCurrentApplication,
kCFPreferencesAnyUser,kCFPreferencesCurrentHost)

~/Library/Preferences/.GlobalPreferences.plist
(kCFPreferencesAnyApplication,kCFPreferencesCurrentUser,
kCFPreferencesAnyHost)

~/Library/Preferences/com.markdouma.App.plist
(kCFPreferencesCurrentApplication,kCFPreferencesCurrentUser,
kCFPreferencesAnyHost)

~/Library/Preferences/ByHost/.GlobalPreferences.UNIQUE\u HOST\u IDENTIFIER.plist
(kCFPreferencesAnyApplication,
kCFPreferencesCurrentUser,kCFPreferencesCurrentHost)

~/Library/Preferences/ByHost/com.markdouma.App.UNIQUE\u HOST\u IDENTIFIER.plist
(kCFPreferencesCurrentApplication,
kCFPreferencesCurrentUser,kCFPreferencesCurrentHost)

虽然
NSUserDefaults
只能写入斜体显示的域组合,它自动具有对粗体显示的域组合的读取权限。换句话说,无需执行任何操作,我可以自动运行以下代码并打印结果:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

NSNumber *miniaturize = [userDefaults
                 objectForKey:@"AppleMiniaturizeOnDoubleClick"];

NSNumber *fastUserSwitching = [userDefaults
                 objectForKey:@"MultipleSessionEnabled"];

NSLog(@"AppleMiniaturizeOnDoubleClick == %@",
            ([miniaturize boolValue] ? @"YES" : @"NO"));

NSLog(@"MultipleSessionEnabled == %@",
            ([fastUserSwitching boolValue] ? @"YES" : @"NO"));
在我的系统上运行该代码将打印以下结果:

 AppleMiniaturizeOnDoubleClick == YES
 MultipleSessionEnabled == YES
这很有意义,因为我启用了快速用户切换和双击以最小化选项
MultipleSessionsEnabled
存储在本地域中的
/Library/Preferences/.GlobalPreferences.plist
,而
AppleMinitarizeOnDoubleClick
存储在用户域中的
~/Library/Preferences/.GlobalPreferences.plist

样本项目:

“此外,这很慢。请不要这样做。”

很抱歉,但这毫无意义(假设我们已经同意不再使用
addSuiteNamed:
)。应用程序缓存用户默认值,使调用以毫秒为单位。询问用户默认值以获取表示本地应用程序值的键的值与表示全局值的键的值之间,不会有什么明显的区别吗


好吧,这是实现OP目标的唯一“合法”(与应用商店兼容)方式。如果还有其他更有效的方法,请详细说明。

[userDefaults AddSuiteName:NSGlobalDomain];比没用还糟糕。全局域包含在NSUserDefaults的默认搜索列表中。此外,对于该方法,NSGlobalDomain不会转换为.GlobalPreferences.plist。另外,这很慢。请不要这样做。关于“另外,该方法的NSGlobalDomain未转换为.GlobalPreferences.plist”,NSGlobalDomain的值为@“NSGlobalDomain”,这与CFPreferences常量不同。NSUserDefaults在内部将NSGlobalDomain转换为kCFPreferencesAnyApplication,但仅在有意义的上下文中这样做。关于速度问题:-AddSuiteName会在写入时触发锁定和复制
 kCFPreferencesAnyUser,
 kCFPreferencesCurrentUser
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

NSNumber *miniaturize = [userDefaults
                 objectForKey:@"AppleMiniaturizeOnDoubleClick"];

NSNumber *fastUserSwitching = [userDefaults
                 objectForKey:@"MultipleSessionEnabled"];

NSLog(@"AppleMiniaturizeOnDoubleClick == %@",
            ([miniaturize boolValue] ? @"YES" : @"NO"));

NSLog(@"MultipleSessionEnabled == %@",
            ([fastUserSwitching boolValue] ? @"YES" : @"NO"));
 AppleMiniaturizeOnDoubleClick == YES
 MultipleSessionEnabled == YES