gpt4 book ai didi

objective-c - 设置绑定(bind)属性时观察 NSUserDefaultsController 不工作

转载 作者:行者123 更新时间:2023-12-03 16:30:12 26 4
gpt4 key购买 nike

设置如下:我有一个 IKImageBrowserView 的子类,其 zoomValue 属性绑定(bind)到共享 NSUserDefaultsController 中的键 VFBrowserZoomValue。我有一个 NSSlider,其 value 绑定(bind)绑定(bind)到同一个键。

这非常适合从 slider 更改浏览器的 zoomValue

我正在尝试在我的 IKImageBrowserView 子类中实现 -magnifyWithEvent:,以允许使用触控板上的捏合手势缩放浏览器。

这是我的实现:

-(void)magnifyWithEvent:(NSEvent *)event
{
if ([event magnification] > 0) {
if ([self zoomValue] < 1) {
[self setZoomValue: [self zoomValue] + [event magnification]];
}
}
else if ([event magnification] < 0) {
if ([self zoomValue] + [event magnification] > 0.1) {
[self setZoomValue: [self zoomValue] + [event magnification]];
}
else {
[self setZoomValue: 0.1];
}
}
}

这会正确更改浏览器的zoomValue。问题在于 NSUserDefaults 未使用新值进行更新。

在应用程序的其他地方,我有一个 -observeValueForKeyPath:ofObject:change:context: 的实现,用于观察浏览器的 zoomValue。如果我在该方法中记录浏览器的缩放值、 slider 的值和默认值中的键,我会发现浏览器的 ZoomValue 尚未推送到 NSUserDefaults 中,并且 slider 尚未更新。

我尝试通过调用 -{will,did}ChangeValueForKey 来包围 -magnifyWithEvent: 方法,但没有效果。

最佳答案

绑定(bind)的 KVO 流不是正交的;绑定(bind)不是属性,而是对属性的引用。这是绑定(bind)如何工作的要记住的简写:

  • KVO 用于将模型的更改传达给 Controller 和 View 。
  • KVC 用于将 View 的更改传达给 Controller 和模型。

因此,当具有绑定(bind)的 View 处理事件时,它需要将更改传播到其绑定(bind)引用自身的属性。

您的代码可能如下所示,其中包含一个实用程序方法,用于通过绑定(bind)完成传播更改的繁重工作:

- (void)magnifyWithEvent:(NSEvent *)event
{
if ([event magnification] > 0) {
if ([self zoomValue] < 1) {
[self setZoomValue: [self zoomValue] + [event magnification]];
}
}
else if ([event magnification] < 0) {
if ([self zoomValue] + [event magnification] > 0.1) {
[self setZoomValue: [self zoomValue] + [event magnification]];
}
else {
[self setZoomValue: 0.1];
}
}

// Update whatever is bound to our zoom value.
[self updateValue:[NSNumber numberWithFloat:[self zoomValue]]
forBinding:@"zoomValue"];
}

有点不幸的是,ImageKit 需要使用 @"zoomValue" 来引用 IKImageBrowserView 的缩放值绑定(bind),AppKit 中的大多数绑定(bind)都有自己的全局字符串常量,例如 NSContentBinding.

这是通过绑定(bind)传播更改的通用实用程序方法:

- (void)updateValue:(id)value forBinding:(NSString *)binding
{
NSDictionary *bindingInfo = [self infoForBinding:binding];

if (bindingInfo) {
NSObject *object = [bindingInfo objectForKey:NSObservedObjectKey];
NSString *keyPath = [bindingInfo objectForKey:NSObservedKeyPathKey];
NSDictionary *options = [bindingInfo objectForKey:NSOptionsKey];

// Use options to apply value transformer, placeholder, etc. to value
id transformedValue = value; // exercise for the reader

// Tell the model or controller object the new value
[object setValue:transformedValue forKeyPath:keyPath];
}
}

实际应用占位符、值转换器等留给读者作为练习。

关于objective-c - 设置绑定(bind)属性时观察 NSUserDefaultsController 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2131750/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com