[英]How can I clone a NSCoding compliant object into a subclass of it?
我有一个NSPopUpButtonCell
的自定义子类,以便可以覆盖其drawBezelWithFrame:inView:
方法。
当前,我必须使用initTextCell:pullsDown:
创建一个新实例,然后手动复制其所有属性。 这相当乏味且容易出错,因为我可能会缺少一些属性。
我想知道是否可以使用initWithCoder:
代替此任务。 我想我应该能够将现有NSPopUpButtonCell
实例中的数据NSPopUpButtonCell
到NSCoder
对象中,例如,导入NSKeyedArchiver
,然后将该数据NSPopUpButtonCell
回我的NSPopUpButtonCell
子类中。 但是我不知道该怎么做。
如果您的子类所做的全部是重写方法,即它没有添加其他字段,那么您可以修改原始NSPopupButtonCell
的类或它的副本,使其成为您的子类的实例。
Apple使用此技术实现KVO,在这种情况下,使用动态生成的子类。 如果您的情况是子类是静态的,这使它变得容易得多,则代码概述为:
object_setClass(<an NSPopupButtonCell instance>,
[<your subclass> class]);
如果可以安全地更改原始实例上的类,则根本不涉及对象创建或复制。
请记住, 仅当子类仅更改行为时才可以执行此操作 。
有关其他说明,请参见此答案 。
高温超导
看来我以前使用过错误的功能。 隔离非常简单。
此代码将NSPopUpButtonCell的属性复制到其子类中,以便我可以覆盖其draw ...方法:
@interface MyPopup : NSPopUpButton
@end
@implementation MyPopup
- (instancetype)initWithCoder:(NSCoder *)coder {
self = [super initWithCoder:coder];
if (self) {
// Set up the archiver
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *arch = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
// Archive the cell's properties
[self.cell encodeWithCoder:arch];
[arch finishEncoding];
// Set up the unarchiver
NSKeyedUnarchiver *ua = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
// Create a subclass of the cell's class, using the same properties
MyCell *newCell = [[MyCell alloc] initWithCoder:ua];
// Assign the new subclass object as the NSButton's cell.
self.cell = newCell;
}
return self;
}
此处显示了另一种使用自定义NSButtonCell子类的更简洁的方法 : 使用NSPopupButton的全角文本,没有箭头
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.