Я пытаюсь настроить NSImageCell
на NSTableView
, используя NSArrayController и привязки, чтобы изменить фон ячейки, которая выбрана. Итак, я создал два изображения NSImage
и сохранил их как normalImage
и activeImage
в экземпляре ячейки, что означает, что я должен выпустить эти два изображения, когда ячейка вызывает свой метод dealloc
. И я переопределитьЧто делает OSX при настройке ячейки NSTableView?
- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
и
- (void) setObjectValue:(id) inObject
Но я считаю, что, когда я нажимаю любую ячейку в Tableview, dealloc
метод ячейки называется.
Поэтому я положил NSLog(@"%@", self);
в метод dealloc
и - (void)drawInteriorWithFrame:inView:
, и я обнаружил, что эти два экземпляра не совпадают.
Может ли кто-нибудь сказать мне, почему dealloc
вызывается каждый раз, когда я нажимаю любую ячейку? Почему эти два экземпляра не совпадают? Что делает OS X, когда я настраиваю ячейку в NSTableView? BTW: Я обнаружил, что -init
вызывается только один раз. Зачем?
EDIT:
Моего код ячейки
@implementation SETableCell {
NSImage *_bgNormal;
NSImage *_bgActive;
NSString *_currentString;
}
- (id)init {
if (self = [super init]) {
NSLog(@"setup: %@", self);
_bgNormal = [[NSImage imageNamed:@"bg_normal"] retain];
_bgActive = [[NSImage imageNamed:@"bg_active"] retain];
}
return self;
}
- (void)dealloc {
// [_bgActive release]; _bgActive = nil;
// [_bgNormal release]; _bgNormal = nil;
// [_currentString release]; _currentString = nil;
NSLog(@"dealloc: %@", self);
[super dealloc];
}
- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
NSLog(@"draw: %@", self);
NSPoint point = cellFrame.origin;
NSImage *bgImg = self.isHighlighted ? _bgActive : _bgNormal;
[bgImg drawAtPoint:p fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
NSPoint strPoint = cellFrame.origin;
strPoint.x += 30;
strPoint.y += 30;
[_currentString drawAtPoint:strPoint withAttributes:nil];
}
- (void) setObjectValue:(id) inObject {
if (inObject != nil && ![inObject isEqualTo:_currentString]) {
[self setCurrentInfo:inObject];
}
}
- (void)setCurrentInfo:(NSString *)info {
if (_currentString != info) {
[_currentString release];
_currentString = [info copy];
}
}
@end
Apple Inc.не сделают ничего кому-либо, если вы не обратитесь к ним, может быть, через магазин Apple и т. д. –
вы все еще в эпоху MRC? Почему вы не используете ARC? –
@AnoopVaidya Это старый проект –