2010-08-03 93 views
7

我一直在嘗試這兩天,並不斷跑入死衚衕。從可變數組中填充NSTableview

我已經通過Aaron Hillegass的MAC OS X的可可編程,並且完成了所有與NSTableview和可變數組相關的練習,並且我一直在嘗試修改它們以適合我的需要。

但是他們都沒有使用一個數組作爲數據源,它似乎使用tableview作爲數據源。

我試圖執行Jonas Jongejan的「重做」我的代碼here,用Cocoa前端來顯示結果。

任何指針或建議我知道這應該很簡單,但我迷失在這裏的荒野中。

我可以通過設置陣列

回答

14

這很簡單真的,一旦你瞭解它訪問陣列(當然!)。您不能直接將NSArray用作表格源。您需要創建一個自定義對象來實現NSTableViewDataSource或在某個現有類中實現該協議 - 通常是一個控制器。如果您使用Xcode創建基於標準文檔的應用程序,那麼文檔控制器類(它將被稱爲MyDocument)是一個很好的類。

您需要實現至少這兩種方法:

– numberOfRowsInTableView: 
– tableView:objectValueForTableColumn:row: 

如果你有一個可變的數組,其值你想在一個表視圖中使用與一列,類似下面應該做的開始:

– numberOfRowsInTableView: (NSTableView*) aTableView 
{ 
    return [myMutableArray count]; 
} 

– tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex 
{ 
    return [myMutableArray objectAtIndex: rowIndex]; 
} 

它剛剛發生,我認爲你可以在上面兩種方法添加爲一個類別的NSArray更換myMutableArrayself,然後你可以使用數組作爲數據源。


反正有可變數組,重要的是你改變它任何時候,你需要讓表視圖知道它已經改變了,所以你需要發送的表視圖-reloadData


如果你的表視圖有多個列,你想用你的數組中的對象的屬性來填充它,有一個竅門,你可以做,使之更容易爲自己。比方說,你的數組中的對象是定義了一個名爲人用兩種方法的類的實例:

-(NSString*) givenName; 
-(NSString*) familyName; 

,你希望你的表視圖,以對每個那些一列,可以設置每列的identifier財產對財產的人的名稱該列顯示和使用類似以下內容:

– tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex 
{ 
    Person* item = [myMutableArray objectAtIndex: rowIndex]; 
    return [item valueForKey: [tableColumn identifier]]; 
} 

如果用valueForKeyPath:替換valueForKey:和您的Person類也有以下方法:

-(Person*) mother; 
-(Person*) father; 
-(NSString*) fullName; // concatenation of given name and family name 

您可以添加具有以下標識符的表格列:father.fullNamemother.familyName,這些值將自動填充。

1

在iPhone上(我知道你在談論Mac,但也許這可能會有所幫助),你必須使用委託加載tableView。它要求一個單元格,並使用你的數組來填充需要的數據。 我不確定這是否適用於Mac,但它值得深入研究。

也許設置數據源自我,並利用這些委託方法基礎上的行和列#

+0

@ willcodejavaforfood的答案是針對iPhone,但你可以按照該鏈接看看我的意思 – RSully 2010-08-03 15:21:09

+0

哎呀,我的iPhone上有iPhone :) – willcodejavaforfood 2010-08-03 15:22:34

3

你可以通過數據源路徑自己完成所有繁重的工作,或者你可以讓綁定爲你完成所有繁重的工作。將NSArrayController添加到包含表格視圖的nib文件中。確保nib的文件所有者被設置爲具有可變數組的相同類。將陣列控制器的contentArray綁定到File's Owner.myMutableArray。對於每個列將Value綁定到陣列控制器arrangedObjects並添加相應的鍵路徑。這將允許你得到像用戶免費分類的東西,如果你需要的話。