1

这似乎是一个基本问题,但我仍在处理属性,所以请多多包涵。

我有一个自定义的 NSView 子类,它自己绘图。我已经使用@propertyfor setter 和typedef enum人类可读的整数设置了对不同样式的支持。setNeedsDisplay:YES它工作得很好,但是除非我手动调用控件或调整其父窗口的大小,否则在设置其样式后视图不会重绘。

从逻辑上讲,人们会认为解决方案是简单地[self setNeedsDisplay:YES]在类的setStyle:方法中做一个,但我一生都无法弄清楚如何正确地做到这一点。每当我尝试覆盖setStyle:它时,都会抱怨,“可写原子属性‘样式’不能将合成的 getter 与用户定义的 setter 配对”。

在这种情况下应该怎么做?

4

3 回答 3

1

理想情况下,您只需将实际 ivar/storage 声明为私有属性,然后手动实现 setter setStyle:。在 的实现中setStyle:,设置您的私有属性/状态,并执行您的更新。因此,您只需从客户端的接口中抽象出数据。还有其他方法可以解决此问题,例如直接设置 ivar。

所以一个实现可以采取以下形式:

MONThing.h

@interface MONThing : NSObject

- (void)setStyle:(t_style)pStyle; // << the client's interface

@end

MONThing.m

@interface MONThing ()

@property (nonatomic, assign, readwrite) t_style userStyle; // << the actual storage

@end

@implementation MONThing

- (void)setStyle:(t_style)pStyle
{
    // validate parameter
    // set our data
    self.userStyle = pStyle;
    // perform effects
    [self setNeedsDisplay:true];
}

随着时间的推移,您将学习多种方法来实现这一点,以及何时您更喜欢其中一种。

于 2012-09-10T00:27:42.407 回答
1

如果您设置自己的 setter,则不要使用 @synthesize 和 @property。这些用于自动创建 setter 和 getter 方法。在接口文件中声明变量就足够了。

于 2012-09-10T00:28:09.423 回答
1

看看这个问题。要复制另一个问题的答案:

如果您将 @property 声明为原子,则执行以下操作之一:

使用@dynamic 或;使用 @synthesize 并保留合成的 setter 和 getter 或;提供 setter 和 getter 的手动实现(不使用上述指令之一)。

于 2012-09-10T00:28:18.623 回答