【问题标题】:Overriding property setter in a class category覆盖类类别中的属性设置器
【发布时间】:2012-10-29 10:17:45
【问题描述】:

我有一个 NSManagedObject 类,我想覆盖一个 setter,但有人告诉我最好不要修改自动生成的类文件并创建类别来扩展它们(因为如果你更改模型并重新生成文件,您会丢失所有添加的内容)。

如果我为某个类别中的 setter 创建一个方法,它肯定会运行该方法(使用 NSLog 测试),但我不知道如何分配实际的属性值。通常,我会使用

合成属性

@synthesize finished = _finished;

这样我就可以使用_finished 访问setter 中的属性,如下所示:

- (void)setFinished:(NSNumber *)finishedValue {
    _finished = finishedValue;
    self.end_time = [NSDate date];
}

但是在NSManagedObject 中定义属性的地方,这似乎是不可能的。

【问题讨论】:

标签: objective-c ios


【解决方案1】:

您可以使用子类化查看文档here

- (void)setName:(NSString *)newName
{
    [self willChangeValueForKey:@"name"];
    [self setPrimitiveName:newName];
    [self didChangeValueForKey:@"name"];
}

【讨论】:

  • 使用 [self setPrimitiveValue:finished forKey:@"finished"] 似乎在该类别中有效,这就是我一直在寻找的,感谢您引导我朝着正确的方向前进
【解决方案2】:

在一个类别中,您不能添加属性值,只能添加方法。所以你需要子类来执行你想要的。

【讨论】:

【解决方案3】:

有一种简单的方法,请尝试以下方法:

模型.h

@interface Model
@property(nonatomic,copy) NSString  * string;
@end

模型 + Override.m

@interface Model ()
{
    NSString *_string;
} 
@end

@implementation Model (Override) 
- (void)setString:(NSString *)string
{
    return _string = string;
}    
@end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    相关资源
    最近更新 更多