some discussion here後,聽起來似乎有些方法可以做到壽:
- 放在模型類一個類別,並覆蓋validateMyKey
- 子類NSFormCell
我都嘗試。更多問題:
- validateMyKey直到模型自動更新後才被調用,因此舊值不可用。
editWithFrame:inView:editor:delegate:event:
在進入一個字段時並不總是被調用,所以很難訪問endEditing:
中的舊值。
新解決方案是對我原來的#2:文本編輯委託實施NSControlTextEditingDelegate
的改進。
而不是controlTextDidBeginEditing:
和controlTextDidEndEditing:
,只實現control:textShouldEndEditing:
。在該方法中,如有必要操作文本,然後返回YES。
我在筆尖實例化它,並使它成爲窗體的委託(而不是單元格)。在下面的代碼中,我使用infoForBinding:
獲得舊值,但如果您未使用綁定,則可以將模型對象添加到插座中。
-(BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor {
NSCell *cell = [(NSForm *)control selectedCell];
NSString *identifier = [(NSCell *)[(NSForm *)control selectedCell] identifier];
if (!identifier) return YES;
NSDictionary *bindingInfo = [cell infoForBinding:@"value"];
if (!bindingInfo) return YES;
NSString *oldValue = [[bindingInfo valueForKey:NSObservedObjectKey] valueForKeyPath:[bindingInfo valueForKey:NSObservedKeyPathKey]];
NSString *newValue = cell.stringValue;
if ([identifier isEqualTo:@"firstField"]) {
if (criteria)
cell.stringValue = ....;
} else if ([identifier isEqualTo:@"secondField"]) {
if (criteria)
cell.stringValue = ....;
}
return YES;
}