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更改。
任何想法,爲什麼它不在第一個例子中工作?
查詢大綱視圖直接解決了問題。謝謝! – VsSoft
至於其他意見: 至於修改數據源這裏是我在做什麼:我有數據存儲在一個字典中,數組作爲值(例如,KEY:App Name VALUES:File1,File2,File3)。我用父母和FileX作爲孩子填充視圖。當我按下按鈕刪除一個項目時,我需要獲取選定的項目,所以我按照上述方法進行了操作。然後根據是否選擇了文件或應用程序處理刪除。 我可能錯過了一些東西,但我沒有看到如何在沒有獲取該項目的情況下修改數據。 – VsSoft
更重要的是,您的數據源(控制器)正在向視圖提供模型對象,然後(通過其複雜的機器)請求視圖交還剛剛給出的模型對象的屬性。這顯然違背了MVC設計模式的五穀。詢問(作爲控制器)其選擇的大綱視圖(通過-itemAtRow:或NSTableView的選定行索引)並直接使用模型對象是絕對要走的路。 –