在我的界面中,我显示了一个语言环境的显示名称:
[[NSLocale currentLocale] displayNameForKey: NSLocaleIdentifier value: identifier]
Run Code Online (Sandbox Code Playgroud)
但是这会使用系统的区域设置来显示显示名称,该区域设置并不总是与应用程序的区域设置相同.例如,如果我用法语设置我的系统并且我的应用程序没有法语本地化,它将在英语界面中提供法语显示名称.相反,我想在英文界面中有一个英文显示名称,所以我不混合语言.
在我的界面中,我有一个NSTextField
谁value
被绑定了NSArrayController's
selection.selectedType.title
.所有NSArrayController's
对象都是自定义对象,每个对象有两种方法:
- (MYType *)selectedType;
- (void)setSelectedType: (MYType *)type;
Run Code Online (Sandbox Code Playgroud)
在不具有伊娃selectedType
.但是,他们确实拥有一个容纳所有MYType
物体的iVar .代码归结为:
- (MYType *)selectedType
{
if (someIndex == 0)
return [types objectAtIndex: 0];
else
return [self typeWithIndex: someIndex];
}
- (void)setSelectedType: (MYType *)type
{
someIndex = [type index];
}
Run Code Online (Sandbox Code Playgroud)
MYType
对象得到了NSString *title
一个相应的@property
和iVar synthesize
.
每当我打电话setSelectedType:
,变化立即可见,NSTextField
并且一切似乎都有效,但我得到一条日志消息说:
无法从MYType 0x1a4830中删除关键路径"selectedType.title"的观察者NSArrayController 0x141160,这很可能是因为在没有发送适当的KVO通知的情况下,"selectedType"键的值已更改.检查MYType类的KVO兼容性.
我尝试setSelectedType:
使用willChangeValueForKey:
和封装方法didChangeValueForKey:
然后我仍然有一个日志消息,但不同的一个:
无法从MYType 0x1a4be0中删除关键路径"title"的观察者NSKeyValueObservance 0x1c7570,因为它未注册为观察者.
objective-c key-value-observing key-value-coding nsarraycontroller cocoa-bindings