gpt4 book ai didi

objective-c - 每次在 Objective-C (Cocoa) 上设置参数时调用一个方法

转载 作者:搜寻专家 更新时间:2023-10-30 20:10:33 25 4
gpt4 key购买 nike

我目前有一个包含 15 个属性(并且还在增加)的类,我发现每次其中一个属性发生变化时,我都必须调用一个更新方法。

目前,我正在使用如下代码覆盖每个 setter :

-(void)setParameterName:(NSUInteger)newValue {
if (_param == newValue)
return;
_param = newValue;
[self redraw];
}

[self redraw]; 方法是这里的关键。

有更好的方法吗?我应该使用 keyValue 观察器(方法 observeValue:forKeyPath:ofObject:change:context:)吗?

注意事项:

  • 所有属性(到目前为止)都是assign(主要是enumNSUIntegerCGFloatBOOL);
  • 所有这些属性都是使用绑定(bind)设置的(方法 bind:toObject:withKeyPath:options:)。 Except 从文件系统加载时(这并不重要,因为加载完成后我已经在每个对象上调用了绘图方法);
  • 值更改仅针对当前对象。当其他对象发生变化时,我不需要被告知;
  • 我还有其他属性,我不需要观察它的变化(因为它不会影响我的输出并且绘制输出有点耗时)。

谢谢!

最佳答案

由于这些属性是使用调用 -setValue:forKey: 的绑定(bind)更新的,因此您可以覆盖该方法而不是编写自定义 setter :

+ (NSArray *) keysAffectingDrawing {
static NSArray *singleton;
if (!singleton)
singleton = [NSArray arrayWithObjects:
@"property1",
@"property2",
@"property3",
nil];
return singleton;
}

- (void) setValue:(id) value forKey:(NSString *) key {
[super setValue:value forKey:key];
if ([[CustomClass keysAffectingDrawing] containsObject:key]) [self redraw];
}

(我首先倾向于推荐键值观察,但同意这不是最好的解决方案。我认为部分原因是只有一个对象,部分原因是设计不遵循 MVC。通常在 MVC 中绘制自身的对象并不具有所有属性。)

(添加:啊,我明白了。模型负责将属性呈现为位图,而这正是 -redraw 所做的。这很好 MVC。让它更清楚,我建议将方法的名称从 -redraw 更改为 -updateImage-renderImage 之类的名称,因为它实际上并没有做任何绘图。)

关于objective-c - 每次在 Objective-C (Cocoa) 上设置参数时调用一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10986657/

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