2016-05-24 10 views
0

カスタムサブクラスNSPopUpButtonCellがありますので、drawBezelWithFrame:inView:メソッドを上書きすることができます。NSCoding準拠のオブジェクトをそのサブクラスにどのようにクローンすることができますか?

現在、initTextCell:pullsDown:を使用して新しいインスタンスを作成し、そのプロパティをすべて手動でコピーする必要があります。それは私がいくつかの特性を失っているかもしれないので、むしろ面倒でエラーが起こりやすいです。

代わりにこのタスクにinitWithCoder:を使用できるのだろうかと思います。私は、既存のNSPopUpButtonCellインスタンスのデータをNSCoderオブジェクトにファイルする必要があると思います。 NSKeyedArchiverに入力し、そのデータを私のNSPopUpButtonCellサブクラスに戻してください。しかし、私はそれを達成する方法を理解することはできません。

+0

ポップアップボタンは、プログラムやXIBをどのように作成しますか? – Willeke

+0

@Willekeペン先から、私はアルテディーがその特定のものをもっと簡単に解決できることを学んだ。それでも、オブジェクトのサブクラスにオブジェクトをクローンする方法があるかどうかを知りたい。 –

答えて

0

私は間違った機能を使用したようです。この懇願はかなり簡単です。

@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サブクラスを使用する方法が示されている:私はそのドロー...メソッドを上書きすることができるように

このコードは、そのサブクラスにNSPopUpButtonCellの性質を複製しますここをクリックしてください:Using full width of NSPopupButton for text, no arrows

1

すべてのサブクラスがオーバーライドメソッドである場合、つまりフィールドを追加しない場合は、オリジナルのクラスNSPopupButtonCellまたはそのコピーをスウィズルして、サブクラスのインスタンスとなります。

アップルはこの手法を使用してKVOを実装しています。その場合は、動的に生成されたサブクラスを使用します。あなたの場合は、サブクラスが、それは非常に簡単になって、静的である場合は、コードの概要は次のとおりです。

object_setClass(<an NSPopupButtonCell instance>, 
       [<your subclass> class]); 

あなたが安全に元のインスタンス上のクラスを変更することができます場合、これはまったくのオブジェクトの作成やコピーが含まれていません。

覚えておいてください。サブタイプが振る舞いだけを変更する場合は、としてください。

別の説明については、this answerを参照してください。

HTH

関連する問題