繁体   English   中英

如何将符合NSCoding的对象克隆到其子类中?

[英]How can I clone a NSCoding compliant object into a subclass of it?

我有一个NSPopUpButtonCell的自定义子类,以便可以覆盖其drawBezelWithFrame:inView:方法。

当前,我必须使用initTextCell:pullsDown:创建一个新实例,然后手动复制其所有属性。 这相当乏味且容易出错,因为我可能会缺少一些属性。

我想知道是否可以使用initWithCoder:代替此任务。 我想我应该能够将现有NSPopUpButtonCell实例中的数据NSPopUpButtonCellNSCoder对象中,例如,导入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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM