这似乎是一个基本问题,但我仍然处理属性,所以请耐心等待。
我有一个自定义的NSView子类,它可以自己创建绘图。我为不同的样式设置了支持,其中@property
用于setter,typedef enum
用于人类可读的整数。它工作得很好,但除非我手动调用控件上的setNeedsDisplay:YES
或调整其父窗口的大小,否则在设置其样式后视图不会重绘。
从逻辑上讲,人们会认为解决方案只是在类[self setNeedsDisplay:YES]
方法中执行setStyle:
,但我不能在我的生活中找出如何正确地执行此操作。每当我试图覆盖setStyle:
时,它只是抱怨,“可写原子属性'样式'不能将合成的getter与用户定义的setter配对”。
在这种情况下该怎么办?
答案 0 :(得分: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];
}
随着时间的推移,您将学习多种方法来实现这一目标,当您倾向于支持另一种方式时。
答案 1 :(得分:1)
如果您设置了自己的setter,则不要使用@synthesize和@property。这些用于自动创建setter和getter方法。在接口文件中声明变量就足够了。
答案 2 :(得分:1)
查看this问题。复制另一个问题的答案:
如果您将@property声明为原子,请执行以下操作之一:
使用@dynamic或; 使用@synthesize并保持合成的setter和getter或; 提供setter和getter的手动实现(不使用上述指令之一)。