2012-02-18 49 views
4

這裏有一段代碼,我使用填充頂級對象基於視圖的NSTableView的數據:加載NSNib訂單沒有特定的順序

- (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錯誤而view對象調用setIdentifier:viewobjectAtIndex:0實際上是NSApplication來自加載的筆尖的頂級對象的實例。

這是一個在筆尖加載機制中的錯誤,或者我在做這個代碼有問題嗎?

+0

@Monolo哪些類對你感興趣? – Eimantas 2012-02-18 13:58:31

+0

你爲什麼要加載這樣的筆尖?爲什麼不使用'NSViewController'?更好的是,只要將單元格視圖添加到表格控制器所在的任何筆尖中,並使用插座來訪問它。 – 2012-02-19 02:22:12

+0

有關這是一個錯誤還是一個功能的任何消息? – hanno 2013-01-23 19:07:09

回答

5

這個線程是有點老了,但它的價值:

目前尚不清楚這是否是一個錯誤,因爲該文件是不特定的向被傳遞迴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]; 
+0

...當然,檢查wasLoaded和viewIndex的理智 – 2012-11-12 21:27:13