在设置属性时执行其他代码的正确方法

时间:2012-09-10 00:18:13

标签: objective-c cocoa properties nsview

这似乎是一个基本问题,但我仍然处理属性,所以请耐心等待。

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

从逻辑上讲,人们会认为解决方案只是在类[self setNeedsDisplay:YES]方法中执行setStyle:,但我不能在我的生活中找出如何正确地执行此操作。每当我试图覆盖setStyle:时,它只是抱怨,“可写原子属性'样式'不能将合成的getter与用户定义的setter配对”。

在这种情况下该怎么办?

3 个答案:

答案 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的手动实现(不使用上述指令之一)。