0

NSActionCell( 内に)のサブクラスを実装していて、NSTableView異常なことに気付きました。isEditingユーザーがセルをクリックしたときにプロパティ ( ) を設定すると、NSCellその後すぐに解放されるため、そのプロパティの値は失われます。コピーを正しく処理していないためにこれが発生していると想定したため、 を追加しましcopyWithZoneた。今、私はcopyWithZone呼ばれているのを見ています - しかし、それは予期しないインスタンスで呼び出されています - そしてそのインスタンスのプロパティはNO- デフォルト値です。が呼び出されるたびcopyWithZoneに、この同じインスタンスで呼び出されます。

誰でもこの動作に光を当てることができますか? 問題のサブクラスと、取得している出力を添付しています。ユーザーが別のセルをクリックしたときにセルのプロパティを保持するには、正確に何をする必要がありますか?

@interface MyCell : NSActionCell <NSCoding, NSCopying>
{
}

@property (nonatomic, assign) BOOL isEditing;

@end

@implementation MyCell

- (id)init
{
    if ((self = [super init]))
    {
        [self initializeCell];
    }

    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if ((self = [super initWithCoder:aDecoder]))
    {
        [self initializeCell];

        self.isEditing = [[aDecoder decodeObjectForKey:@"isEditing"] boolValue];
        NSLog(@"initWithCoder %ld %i", (NSInteger)self, self.isEditing);
    }

    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [super encodeWithCoder: aCoder];
    NSLog(@"encode %i", self.isEditing);

    [aCoder encodeObject:[NSNumber numberWithBool:self.isEditing] forKey:@"isEditing"];
}

- (void)dealloc
{
    NSLog(@"dealloc %ld %i", (NSInteger)self, self.isEditing);
    [super dealloc];
}

- (id)copyWithZone:(NSZone *)zone
{
    MyCell *copy;

    if ((copy = [[MyCell allocWithZone:zone] init]))
    {
        copy.isEditing = self.isEditing;
    }

    NSLog(@"copy %ld %i new: %ld", (NSInteger)self, self.isEditing, (NSInteger)copy);

    return copy;
}

- (void)initializeCell
{
    self.isEditing = NO;
}

- (BOOL)startTrackingAt:(NSPoint)startPoint inView:(NSView *)controlView
{
    return YES;
}

- (void)stopTracking:(NSPoint)lastPoint at:(NSPoint)stopPoint inView:(NSView *)controlView mouseIsUp:(BOOL)flag
{
    if (flag)
    {
        self.isEditing = YES;
        NSLog(@"stopTracking %ld %i", (NSInteger)self, self.isEditing);
    }
}

@end

出力 (ユーザーがセルをクリックすると生成される):

2012-11-21 08:17:59.544 SomeApp[2778:303] copy 4310435936 0 new: 4310152512
2012-11-21 08:18:00.136 SomeApp[2778:303] stopTracking 4310152512 1
2012-11-21 08:18:00.136 SomeApp[2778:303] dealloc 4310152512 1

そして別のクリック(別のセルで):

2012-11-21 08:19:24.994 SomeApp[2778:303] copy 4310435936 0 new: 4310372672
2012-11-21 08:19:25.114 SomeApp[2778:303] stopTracking 4310372672 1
2012-11-21 08:19:25.114 SomeApp[2778:303] dealloc 4310372672 1
4

1 に答える 1

1

プロパティを保持したいようですね。そうですか。

セルのプロパティを NSCell ではなくモデル オブジェクトに格納し、セルまたはテーブル ビューのデリゲートにモデルから値を取得させることで、設計を調整すると、おそらく簡単になります。

このプロパティを使用して達成しようとしている特定の動作は何ですか?

于 2012-11-21T17:59:21.940 に答える