2012-11-21 3 views
0

NSActionCell (NSTableView 내부)의 서브 클래스를 구현 중이며 특이한 것을 알았습니다. 사용자가 셀을 클릭 할 때 속성 (isEditing)을 설정하면 NSCell이 곧 릴리스되므로 해당 속성의 값이 손실됩니다. 나는 정확하게 복사를 다루지 않았기 때문에 이런 일이 일어났다 고 생각 했으므로 copyWithZone을 추가했다. 이제 copyWithZone이 호출되었지만 예기치 않은 인스턴스에서 호출되었습니다.이 인스턴스의 속성은 기본값 인 NO입니다. copyWithZone이 호출 될 때마다이 인스턴스에서 호출됩니다.NSCell의 예기치 않은 동작

누구든지이 동작에 관해 밝힐 수 있습니까? 나는 문제의 서브 클래스를 첨부하고 있는데, 나는 출력을 얻고있다. 사용자가 다른 셀을 클릭 할 때 셀 속성이 유지되도록하려면 정확히 무엇이 필요합니까?

@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 

답변

1

소리가 난다 속성 - 그게 맞습니까?

NSCell 대신 모델 객체에 셀 속성을 저장하고 셀 또는 테이블 뷰 대리자가 모델에서 값을 가져 오게하여 디자인을 조정하면 더 쉬울 것입니다.

이 속성을 사용하여 달성하려는 특정 행동은 무엇입니까?

+0

이 셀에는 결국 다른 속성이 포함됩니다. 현재, 키보드 단축키 ([ShortcutRecorder] (http://code.google.com/p/shortcutrecorder/)와 유사하지만 NSTableView 내부)를 차단할 사용자 지정 셀을 구현하려고합니다.이 특정 속성은 셀이 편집 상태인지 여부를 추적 – Melllvar

+0

편집 상태가 아닌데도 셀이 실제로 키보드 이벤트를 받고 있습니까? NSActionCell 대신 NSTextFieldCell을 재정의 한 것으로 생각하십니까? 비슷한 상황에서 내가 수행 한 다른 작업은 다음과 같습니다. 편집 행과 열의 트랙을 유지하는 NSTableView 서브 클래스 -'-editColumn : row : withEvent : select :'와'-textDidEndEditing'. – paulmelnikow

+0

NSTextField를 사용할 수 없다고 생각합니다 - 키 이벤트를 가로 챌 필요가 있습니다. NSTextField 'keyDown' (또는'keyUp' - 나는 기억할 수 없습니다.)을 모두 억제합니다. 나는 다른 모든 것이 실패 할지라도 다시 시도 할 것입니다. (내가 훨씬 더 멀리 갈 수 있을지는 의아하지만). 유사한 주제에 대한 예는 놀랍습니다. ng. – Melllvar