2011-08-19 86 views
1

我有一個奇怪的問題出現在NSOutlineView中。該視圖基本上是一個包含關聯文件作爲子項的應用程序列表。我手工填充數據源中的視圖,所有這些工作都很好。我現在想要做的是有一個按鈕來刪除一個項目。爲了做到這一點,我實現的方法,removeAppOrFile,像這樣:從NSOutlineView中檢索單元格內容

- (IBAction)removeAppOrFile:(id)sender 
{ 
    NSInteger selectedRow = [myView selectedRow]; 
    if (selectedRow == -1) //ie. nothing's selected 
    { 
     return; 
    } 
    NSTableColumn *col = [myView tableColumnWithIdentifier:@"Column 1"]; 
    NSCell *cell = [col dataCellForRow:selectedRow]; 
    NSString *item = [cell stringValue]; 
    NSLog(@"The row is: %ld\nThe column is: %@\nThe cell is: %@\nThe selected item is: %@",selectedRow, col, cell, item); // For testing purposes 
} 

MyView的是連接到我的NSOutlineView一個IBOutlet。 如果我選擇不同的行並單擊該按鈕,selectedRow的值將會正確更改,但NSCell對象永遠不會更改,它的值應該是什麼(即NSString項)總是顯示最後一個可見項(即if有一個項目包含子項目作爲最後一項NSString項目如果未展開則爲父項目,如果展開則爲最後一個子項目)。

奇怪的是,我在其他地方使用基本上相同的代碼在NSOutlineView上的doubleAction,它完美的工作。在這種情況下,代碼如下:

- (void)editedAppOrFile:(id)sender 
{ 
    NSInteger rowNumber = [sender clickedRow]; 
    NSTableColumn *col = [sender tableColumnWithIdentifier:@"Column 1"]; 
    NSCell *cell = [col dataCellForRow:rowNumber]; 
    NSString *item = [cell stringValue]; 
    NSLog(@"The row is: %ld\nThe column is: %@\nThe cell is: %@\nThe selected item is: %@",selectedRow, col, cell, item); // For testing purposes 
} 

在這種情況下發送者是outlineView。項目&單元更改與rowNumber更改。

任何想法,爲什麼它不在第一個例子中工作?

回答

3

你的方法有幾個問題。

  1. 你得到的數據單元,而不是-preparedCellAtColumn:row:,所以你不知道它的內部對象的值是什麼保證。
  2. 您可以直接詢問概要視圖-itemAtRow:
  3. 如果您嘗試刪除(在第一種情況下)或編輯(第二種情況),您實際上只需修改您的數據源,然後記下更改行數(第一種情況)或重新加載行數據第二種情況)。
+0

查詢大綱視圖直接解決了問題。謝謝! – VsSoft

+0

至於其他意見: 至於修改數據源這裏是我在做什麼:我有數據存儲在一個字典中,數組作爲值(例如,KEY:App Name VALUES:File1,File2,File3)。我用父母和FileX作爲孩子填充視圖。當我按下按鈕刪除一個項目時,我需要獲取選定的項目,所以我按照上述方法進行了操作。然後根據是否選擇了文件或應用程序處理刪除。 我可能錯過了一些東西,但我沒有看到如何在沒有獲取該項目的情況下修改數據。 – VsSoft

+1

更重要的是,您的數據源(控制器)正在向視圖提供模型對象,然後(通過其複雜的機器)請求視圖交還剛剛給出的模型對象的屬性。這顯然違背了MVC設計模式的五穀。詢問(作爲控制器)其選擇的大綱視圖(通過-itemAtRow:或NSTableView的選定行索引)並直接使用模型對象是絕對要走的路。 –