2008-09-16 78 views
2

我想根據要顯示的數據動態地隱藏/顯示NSTableView中的某些列 - 基本上,如果列爲空,我希望列是隱。我目前使用控制器類作爲表的委託來填充表。動態地隱藏NSTableView中的列

任何想法?我發現我可以將該列設置爲隱藏在Interface Builder中,但是現在似乎沒有時間通過​​列並檢查它們是否爲空,因爲似乎沒有一種方法是在填充表格中的所有數據之前/之後調用。

回答

0

NSTable只是繪製表格的類。正如你自己所說的,你有一些課程將你的表格作爲委託,並且這個類爲表格提供要顯示的數據。如果將表格數據作爲NSArray存儲在委託類中,應該很容易找出一列是否爲空,不是嗎? NSArray通過委託方法詢問你的班級有多少列,所以當你被問到時,爲什麼不尋找有多少列你有數據和報告這個數字,而不是你存儲在內部的實際列數,然後當被問到爲(列,行)提供數據,只需跳過空列即可。

+0

,使一個很多感......我應該可能想到這一點。我想,我只需要可可的更多經驗。謝謝您的幫助。 :) – Andy 2008-09-30 21:47:34

1

我目前還沒有完整的答案,但看看Bindings。通常可以用Cocoa Bindings做各種事情。

有沒有能見度的NSTableColumn約束力,但你可以設置寬度爲0

然後你可以將它綁定到空佔位符,將該值設置爲0 - 但不要忘了將其他佔位符設置爲合理的值。

(正如我所說,這只是一個開始,它可能需要一些調整)。

0

沒有一次所有的數據都被填充。 NSTableView不存儲數據,它從數據源動態請求數據(如果使用綁定,則綁定到對象)。它只是使用從數據源獲得的數據並將其丟棄。例如,您不應該看到表格要求輸入任何不可見的數據。

這聽起來像你正在使用數據源?當數據改變時,你有責任在表上調用-reloadData,這有點不恰當。這更像是「使一切無效」。

也就是說,您應該已經知道數據何時更改。這是您可以計算哪些列應該隱藏的點。

3

我已經使用綁定完成了這項工作,但通過編程方式而不是通過Interface Builder進行設置。

該僞片斷應該給你它的要點:

NSTableColumn *aColumn = [[NSTableColumn alloc] initWithIdentifier:attr]; 
[aColumn setWidth:DEFAULTCOLWIDTH]; 
[aColumn setMinWidth:MINCOLWIDTH]; 
[[aColumn headerCell] setStringValue:columnLabel]; 

[aColumn bind:@"value" 
    toObject:arrayController 
    withKeyPath:keyPath 
    options:nil];    

[tableView addTableColumn:aColumn]; 
[aColumn release]; 

當然,你可以添加格式化和所有的東西也。

0

@amrox - 如果我正確理解你的建議,你說我應該將一個值綁定到我的表中NSTableColumns的隱藏屬性?這似乎可以工作,但我不認爲NSTableColumn有一個隱藏的屬性,因爲isHidden和setHidden消息控制列的可見性 - 告訴我,這不是一個屬性,除非我失去了一些東西(這很有可能)。

10

在Mac OS X v10.5及更高版本中,有NSTableColumn的setHidden: selector

這使得列動態地隱藏/與使用標識符顯示:

NSInteger colIdx; 
NSTableColumn* col; 

colIdx = [myTable columnWithIdentifier:@"columnIdent"]; 
col = [myTable.tableColumns objectAtIndex:colIdx]; 
[col setHidden:YES]; 
1

它不會在Interface Builder的工作。然而它以編程方式工作。這是我如何綁定一個NSTableViewColumn與標識 「狀態」 的關鍵在我的NSUserDefaults的:

斯威夫特:

tableView.tableColumnWithIdentifier("Status")?.bind("hidden", toObject: NSUserDefaults.standardUserDefaults(), withKeyPath: "TableColumnStatus", options: nil) 

的Objective-C:

[[self.tableView tableColumnWithIdentifier:@"Status"] bind:@"hidden" toObject:[NSUserDefaults standardUserDefaults] withKeyPath:@"TableColumnStatus" options:nil];