4 Stimmen

Geladene NSNib ordnet Objekte der obersten Ebene in keiner bestimmten Reihenfolge

Hier ist ein Stück Code, das ich verwende, um view-based NSTableView mit Daten zu füllen:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    MyCustomCellView *view = (MyCustomCellView *)[tableView makeViewWithIdentifier:@"MyCustomCellView" owner:self];
    if (!view) {
        NSNib *cellNib = [[NSNib alloc] initWithNibNamed:@"MyCustomCellView" bundle:[NSBundle mainBundle]];
        NSArray *array = nil;
        if ([cellNib instantiateNibWithOwner:self topLevelObjects:&array]) {
            DLog(@"%@", array);
            view = [array objectAtIndex:0];
            [view setIdentifier:@"MyCustomCellView"];
        }
        [cellNib release];
    }

    MyObject *object = [_objects objectAtIndex:row];

    [[view titleTextField] setStringValue:object.title];

    return view;
}

En DLog Anweisung druckt Arrays wie folgt für zwei aufeinanderfolgende Delegatenaufrufe:

(
    "<MyCustomCellView: 0x7fb2abe81f70>",
    "<NSApplication: 0x7fb2ab80cbf0>"
)
(
    "<NSApplication: 0x7fb2ab80cbf0>",
    "<MyCustomCellView: 0x7fb2abb2c760>"
)

Dies ist nur für zwei Zeilen von einigen hundert ausgegeben, so dass ich zufällig entweder meine Ansicht korrekt angezeigt oder ich erhalten unrecognized selector Fehler beim Aufruf setIdentifier: para view Objekt, wenn view unter objectAtIndex:0 ist eigentlich eine Instanz von NSApplication Objekt der obersten Ebene aus der geladenen Feder.

Ist dies ein Fehler in der Nib-Lademechanismus oder bin ich tun etwas falsch mit diesem Code?

5voto

Sam Hatchett Punkte 503

Dieser Thread ist zwar schon etwas älter, aber was soll's:

Es ist nicht klar, ob dies ein Fehler ist, da die Dokumentation nicht spezifisch ist, was die Reihenfolge des Arrays betrifft, das in der topLevelObjects: Parameter. Allerdings hat dieses Snippet für mich gearbeitet.

NSArray *arrayOfViews;
BOOL wasLoaded = [[NSBundle mainBundle] loadNibNamed:xibName owner:self topLevelObjects:&arrayOfViews];
NSUInteger viewIndex = [arrayOfViews indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
  return [obj isKindOfClass:[MyCustomView class]];
}];

self = [arrayOfViews objectAtIndex:viewIndex];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X