gpt4 book ai didi

objective-c - 设置属性时执行附加代码的正确方法

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

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

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

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

遇到这种情况应该怎么办?

最佳答案

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

随着时间的推移,您将学习多种方法来实现这一目标,以及何时您会选择其中一种。

关于objective-c - 设置属性时执行附加代码的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12344077/

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