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
이 셀에는 결국 다른 속성이 포함됩니다. 현재, 키보드 단축키 ([ShortcutRecorder] (http://code.google.com/p/shortcutrecorder/)와 유사하지만 NSTableView 내부)를 차단할 사용자 지정 셀을 구현하려고합니다.이 특정 속성은 셀이 편집 상태인지 여부를 추적 – Melllvar
편집 상태가 아닌데도 셀이 실제로 키보드 이벤트를 받고 있습니까? NSActionCell 대신 NSTextFieldCell을 재정의 한 것으로 생각하십니까? 비슷한 상황에서 내가 수행 한 다른 작업은 다음과 같습니다. 편집 행과 열의 트랙을 유지하는 NSTableView 서브 클래스 -'-editColumn : row : withEvent : select :'와'-textDidEndEditing'. – paulmelnikow
NSTextField를 사용할 수 없다고 생각합니다 - 키 이벤트를 가로 챌 필요가 있습니다. NSTextField 'keyDown' (또는'keyUp' - 나는 기억할 수 없습니다.)을 모두 억제합니다. 나는 다른 모든 것이 실패 할지라도 다시 시도 할 것입니다. (내가 훨씬 더 멀리 갈 수 있을지는 의아하지만). 유사한 주제에 대한 예는 놀랍습니다. ng. – Melllvar