Frage

Ich versuche also, das SourceView -Beispiel in meiner App zu duplizieren. Ich kann die Quellliste perfekt erstellen, gut. Ich kann auch die Behälter erweitern und alles wird gut angezeigt. Wenn ich jedoch ein Element in der Liste auswähle, stürzt die App mit einem exc_bad_access ab.

Backtrace

#0  0x7fff86532340 in objc_msgSend_vtable14
#1  0x7fff8508f622 in -[NSImage _deallocAuxiliaryStorage]
#2  0x7fff8508f5a1 in -[NSImage dealloc]
*#3 0x100002913 in -[SourceListCell setImage:] at SourceListCell.m:23
*#4 0x100001c31 in -[ProjectController outlineView:willDisplayCell:forTableColumn:item:] at ProjectController.m:166
#5  0x7fff85103085 in -[NSTableView preparedCellAtColumn:row:]
#6  0x7fff8511bc3f in -[NSTableView _drawContentsAtRow:column:withCellFrame:]
#7  0x7fff8511bbb5 in -[NSOutlineView _drawContentsAtRow:column:withCellFrame:]
#8  0x7fff8511acd8 in -[NSTableView drawRow:clipRect:]
#9  0x7fff8511a5cb in -[NSTableView drawRowIndexes:clipRect:]
#10 0x7fff8511a44c in -[NSOutlineView drawRowIndexes:clipRect:]

Sourzelistcell

@interface SourceListCell : NSTextFieldCell {
    NSImage *image;
}

@property(nonatomic, retain) NSImage *image;

@end

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

    [self setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];

    return self;
}

- (void)dealloc {
    [image release];
    image = nil;
    [super dealloc];
}

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
    if (image != nil) {
        [image setSize:NSMakeSize(kIconImageSize, kIconImageSize)];
        // the cell has an image: draw the normal item cell
        NSSize imageSize;
        NSRect imageFrame;

        imageSize = [image size];
        NSDivideRect(cellFrame, &imageFrame, &cellFrame, 3 + imageSize.width, NSMinXEdge);

        imageFrame.origin.x += kImageOriginXOffset;
        imageFrame.origin.y -= kImageOriginYOffset;
        imageFrame.size = imageSize;

        if ([controlView isFlipped])
            imageFrame.origin.y += ceil((cellFrame.size.height + imageFrame.size.height) / 2);
        else
            imageFrame.origin.y += ceil((cellFrame.size.height - imageFrame.size.height) / 2);
        [image compositeToPoint:imageFrame.origin operation:NSCompositeSourceOver];

        NSRect newFrame = cellFrame;
        newFrame.origin.x += kTextOriginXOffset;
        newFrame.origin.y += kTextOriginYOffset;
        newFrame.size.height -= kTextHeightAdjust;
        [super drawWithFrame:newFrame inView:controlView];
    }
}

Umrissansichtsdelegierter

- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(NSCell*)cell forTableColumn:(NSTableColumn*)tableColumn item:(id)item {
    if ([[tableColumn identifier] isEqualToString:COLUMNID_NAME]) {
            if ([cell isKindOfClass:[SourceListCell class]]) {
                //item = [item representedObject];
                NSImage *iconImage;
                iconImage = [[NSWorkspace sharedWorkspace] iconForFile:[item path]];
                [item setNodeIcon:iconImage];

                [(SourceListCell*)cell setImage:[item nodeIcon]];

            }
    }

}
War es hilfreich?

Lösung

Das Problem war in meinem benutzerdefinierten nStextfieldcell: Ich musste CopyWithzone implementieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top