2013-10-07 40 views
9

作爲標題。 NSTableView如何通過代碼設置內容模式(基於視圖還是基於單元格)?NSTableView如何通過代碼設置內容模式(基於視圖還是基於單元格)?

感謝您的幫助

+0

我查看了.h文件中的NSTableView,NSTableViewDelegate和NSTableViewDataSource,並沒有在其中看到任何*明顯的*。我懷疑NSTableView在代碼中的工作方式是它首先嚐試獲取視圖,如果這不起作用,它將執行基於單元的操作。無論哪種方式,99%的開發人員將通過Interface Builder中的彈出窗口選擇「View」或「Cell」。 –

回答

10

NSTableView默認爲是基於細胞的,這使得爲了向後兼容感。當表視圖委託實現-tableView:viewForTableColumn:row:時,表視圖是基於視圖的。您可以輕鬆地測試通過編程方式創建一個表視圖如下:

@implementation BAVAppDelegate 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    NSView *contentView = self.window.contentView; 
    NSTableView *tableView = [[NSTableView alloc] initWithFrame:(NSRect){{50, NSMaxY(contentView.frame) - 200}, {400, 200}}]; 
    tableView.dataSource = self; 
    tableView.delegate = self; 
    [contentView addSubview:tableView]; 

    NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"column"]; 
    column.width = 400; 
    [tableView addTableColumn:column]; 
} 

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { 
    return 3; 
} 

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 
    return [NSString stringWithFormat:@"%ld", row]; 
} 

//- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 
// NSTextField *textField = [[NSTextField alloc] initWithFrame:(NSRect){.size = {100, 15}}]; 
// textField.stringValue = [NSString stringWithFormat:@"%ld", row]; 
// return textField; 
//} 

@end 

如果你運行該代碼註釋掉的委託方法,你就會得到一個基於細胞的表視圖:

enter image description here

如果你取消對委託方法,你就會得到一個基於視圖的表視圖:

enter image description here

的文檔-tableView:viewForTableColumn:row:指出

,如果你想使用的NSView對象,而不是一個表視圖中的細胞的NSCell對象,則需要此方法。單元格和視圖不能在同一個表格視圖中混合使用。

暗示它是確定表視圖是基於單元格還是基於視圖的條件。

+0

你不會找到比這更完整的答案。 – uchuugaka

+2

不要在上面的'-applicationDidFinishLaunching'中跳過添加'NSTableColumn'!我幾次錯過了那部分答案。 – waggles

+0

謝謝@搖動!那是我錯過的一點,但假設我有「內容模式」問題。 – Giles

相關問題