2008-10-11 35 views
5

我需要知道用戶何時完成編輯NSTableView中的單元格。該表格包含所有用戶的日曆(從CalCalendarStore獲取),因此爲了保存用戶的更改,我需要將更改通知CalCalendarStore。然而,在用戶完成編輯之後,我找不到任何被調用的東西 - 我猜想在表格的委託中會有一個方法,但我只看到一個在編輯開始時被調用,而不是在編輯結束時被調用。當用戶完成編輯NSTableView中的單元格時,如何得到通知?

回答

2

子類NSTableView並覆蓋textDidEndEditing :(確保調用super的實現)。

這隻會被文本字段NSTextFieldCell或NSComboBoxCell調用(但只能通過鍵入值來更改值,而不是通過從組合菜單中選擇值)。

+0

看起來它會起作用。非常感謝你。 :) – Andy 2008-10-12 12:56:46

1

看看NSTableDataSource協議。您正在查找的消息被稱爲:tableView:setObjectValue:forTableColumn:row:

+1

這可能是正確的答案。這就是說,它只適用於基於單元格的表格。如果您使用的是基於視圖的表格,則永遠不會調用該方法。 – dgatwood 2014-09-20 04:29:14

1

這似乎不適用於我的情況。我將我的控制器類設置爲表的DataSource,但該方法從未被調用過。數據是我的表綁定到NSArrayController中的值 - 這可能是爲什麼我的對象不被調用? toObjectsAtIndexes:forKeyPath:選項:背景:

您還需要設置陣列本身的觀察者,這樣你就會得到通知的對象

2

使用的addObserver設置觀察員內容陣列中的每個項目添加到陣列或從陣列中刪除。例如iSpend項目。

-1

子類NSArrayController並重寫objectDidEndEditing :(確保調用super的實現)。

這通常只會被文本字段NSTextFieldCell或NSComboBoxCell調用(但只有通過鍵入值來更改值,而不是通過從組合菜單中選擇值)。可能有其他幾個單元格會調用它,但我不確定哪些單元格。如果你有一個自定義單元,那麼就考慮實現NSEditor和NSEditorRegistration非正式協議。

14

通過使用NSNotificationCenter或使用NSControl方法,可以實現相同的結果,而無需對NSTableView進行分類。看到這裏的蘋果文檔:

http://developer.apple.com/library/mac/#qa/qa1551/_index.html

這只是一個幾行代碼,並完美地爲我工作。


如果你可以的delegateNSTableView你只需要實現方法

- (void)controlTextDidEndEditing:(NSNotification *)obj { ... } 

事實上,NSTableView是它所包含的NSControl元素的delegate,並轉發這些方法調用其delegate(還有其他方法是有用的)

否則,使用NSNotificationCenter

// where you instantiate the table view 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(editingDidEnd:) 
    name:NSControlTextDidEndEditingNotification object:nil]; 

// somewhere else in the .m file 
- (void)editingDidEnd:(NSNotification *)notification { ... } 

// remove the observer in the dealloc 
- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
    name:NSControlTextDidEndEditingNotification object:nil]; 
    [super dealloc] 
} 
+1

嗯,這是對還是錯,取決於你使用的是基於單元格還是基於視圖的表格。如果您使用的是基於單元格的表格,並且您的目標是寫出更改,則此方法不起作用,因爲此通知在* tableView:setObjectValue:forTableColumn:row:方法被調用以將值存儲數據源,所以你會寫出舊的值。 – dgatwood 2014-09-20 04:25:53

0

翻譯@米莉的回答爲斯威夫特3

// Setup editing completion notifications 
NotificationCenter.default.addObserver(self, selector: #selector(editingDidEnd(_:)), name: NSNotification.Name.NSControlTextDidEndEditing, object: nil) 

函數來處理通知:

func editingDidEnd(_ obj: Notification) { 
    guard let newName = (obj.object as? NSTextField)?.stringValue else { 
     return 
    } 

    // post editing logic goes here 
} 
相關問題