2012-03-12 67 views
3

我想選擇和編輯新添加的對象的名稱屬性。在NSTableView中選擇和編輯新對象

在OSX上,我有一個數組控制器,它在表格視圖中顯示其內容。我通過AC的屬性連接了表列的值(使用綁定)。另外,我將表視圖的內容和selectionIndexes綁定設置爲指向AC。

我的子類AC在表視圖中有一個IBOutlet(稱爲tableView),幷包含來自數據模型的託管對象。

在我的AC中,我重寫了add:方法。

- (void)add:(id)sender { 
    [super add:sender]; 
    [[self managedObjectContext] processPendingChanges]; // no effect 
    [tableView reloadData]; // no effect 
    [tableView scrollRowToVisible:[[self arrangedObjects] count]-1]; 
} 

新添加的對象出現在選定狀態的表格視圖中(我在IB中設置了AC來選擇新插入的對象)。但是表格視圖向下滾動到最後一行,將新行放在可見視圖之外。

當我嘗試這一點,

[tableView scrollRowToVisible:[tableView selectedRow]]; 

或此,

[tableView scrollRowToVisible:[self selectionIndex]]; 

它會變得更糟糕:selectionIndex似乎並沒有被正確地更新。

- (void)add:(id)sender { 
    [super add:sender]; 
    NSLog(@"selectionIndex = %lu", [self selectionIndex]); 
    NSLog(@"number of objects in AC = %lu", [[self arrangedObjects] count]); 
} 

記錄selectionIndex顯示它始終顯示以前的選擇索引。 記錄AC中的對象數量總是太少。

我是否試圖操縱表視圖太早?任何想法哪種方法更適合重寫?


關於編輯部分..

下面的語句干擾了上述scrollRowToVisible:方法,作爲最後一個參數似乎選擇行也是如此。

[tableView editColumn:0 row:0 withEvent:nil select:YES]; 

不管怎麼說,指定的字段(用於測試表的第一行)似乎進入編輯模式只是一個瞬間的閃爍,但隨後立即完編輯。

任何幫助將不勝感激。

+0

有沒有辦法解決這個綁定?一個NSArrayController有一個綁定來自動選擇新的插入。 NSTableView無法綁定,自動開始編輯單元格? – Fnord23 2012-03-12 13:44:52

回答

3

一個解決方案,我想出了:

- (void)rearrangeObjects { 
    [super rearrangeObjects]; 
    [tableView editColumn:0 row:[self selectionIndex] withEvent:nil select:YES]; 
} 

最後一個參數select:YES表不滾動到該行,也不會選擇行。以下行也滾動表視圖。

[tableView editColumn:0 row:[self selectionIndex] withEvent:nil select:NO]; 

select:YES選擇正在編輯的文本字段中的文本。

不過,我想知道我是否正確地做了這件事。該解決方案要求每個陣列控制器都有一個到顯示其數據的表視圖的出口。這似乎是多餘的,因爲表格視圖(及其列)已被綁定到AC。

試圖實現MVC設計模式,不應該編輯單元格的責任,委託給表視圖?

+0

另外,撤銷(一個或多個新插入)表現不穩定。該表失去了新行的選擇,這使得表格滾動到頂部。結果是用戶看不到他正在撤消的更改。當表格包含數千個條目時,這是相當煩人的。 – Fnord23 2012-03-13 09:12:45

1

問題是數組控制器不會立即添加新對象。該documentation for -[NSArrayController add:]說:

與Mac OS X v10.4的這種方法的結果是推遲 直到runloop從而使錯誤陳述 機制(見錯誤響應者和錯誤恢復)的下一次迭代可以開始提供 反饋作爲工作表。

我不知道任何優雅的方式來解決這個問題。您可以嘗試繞過add:方法,方法是將該對象直接添加到數組控制器綁定的NSMutableArray。或者,您可以嘗試使用performSelector:withObject:afterDelay:,並將其延遲爲0。1秒,此時應該添加對象。

+0

謝謝湯姆,你的回答激勵我解決這個問題。 – Fnord23 2012-03-13 09:25:59