Загруженный NSNib упорядочивает объекты верхнего уровня в произвольном порядке - PullRequest
4 голосов
/ 18 февраля 2012

Вот фрагмент кода, который я использую для заполнения NSTableView на основе представления данными:

- (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;
}

Оператор DLog печатает массивы следующим образом для двух последовательных вызовов делегата:

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

Это выводится только для двух строк из нескольких сотен, поэтому я случайно либо правильно отображаю свое представление, либо получаю ошибку unrecognized selector при вызове setIdentifier: для view объекта, когда view равен objectAtIndex:0на самом деле это экземпляр NSApplication объекта верхнего уровня из загруженного пера.

Это ошибка в механизме загрузки пера или я что-то не так делаю с этим кодом?

1 Ответ

5 голосов
/ 13 ноября 2012

Эта ветка немного старая, но для чего она стоит:

Не ясно, является ли это ошибкой, поскольку документация не является специфической в ​​отношении порядка расположения массива, который передается обратно в параметре topLevelObjects:. Однако этот фрагмент сработал для меня.

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];
...