这是我在我的应用中看到的一个非常奇怪的问题。我有一个NSTextField绑定到NSManagedObject的属性,但每当保存对象时,文本字段失去焦点。我不断更新绑定的值,所以这远非理想。
之前有没有人见过这样的事情,并且(希望)找到了解决方案?
答案 0 :(得分:5)
我最近遇到了这个问题并通过更改NSTextField绑定到NSManagedObject属性的方式来修复它。我没有将文本字段的值绑定到NSArrayController的选择。[attribute]键路径,而是绑定了视图控制器的arrayController.selection。[attribute] keyPath,该控制器具有指向控制器的正确插座。
出于某种原因,如果以这种方式绑定保存NSManagedObjectContext,则NSTextField不会失去焦点。
答案 1 :(得分:4)
我想分享我的解决方案。它适用于所有领域而无需修改。 我已针对此发布对其进行了优化,并删除了一些错误检查,日志记录和线程安全性。
- (BOOL)saveChanges:(NSError **)outError {
BOOL result = YES;
@try {
NSError *error = nil;
if ([self hasChanges]) {
// Get field editor
NSResponder *responder = [[NSApp keyWindow] firstResponder];
NSText *editor = [[NSApp keyWindow] fieldEditor: NO forObject: nil];
id editingObject = [editor delegate];
BOOL isEditing = (responder == editor);
NSRange range;
NSInteger editedRow, editedColumn;
// End editing to commit the last changes
if (isEditing) {
// Special case for tables
if ([editingObject isKindOfClass: [NSTableView class]]) {
editedRow = [editingObject editedRow];
editedColumn = [editingObject editedColumn];
}
range = [editor selectedRange];
[[NSApp keyWindow] endEditingFor: nil];
}
// The actual save operation
if (![self save: &error]) {
if (outError != nil)
*outError = error;
result = NO;
} else {
result = YES;
}
// Now restore the field editor, if any.
if (isEditing) {
[[NSApp keyWindow] makeFirstResponder: editingObject];
if ([editingObject isKindOfClass: [NSTableView class]])
[editingObject editColumn: editedColumn row: editedRow withEvent: nil select: NO];
[editor setSelectedRange: range];
}
}
} @catch (id exception) {
result = NO;
}
return result;
}
答案 2 :(得分:3)
好的,感谢Martin指出我应该更仔细地阅读文档。这是预期的行为,这就是我做的事情(用你的判断判断这是否适合你):
我每隔3秒保存一次上下文,在我开始执行save:
上的实际NSManagedObjectContext
方法之前,检查上下文是否有任何更改。我在我的Core Data控制器类中添加了一个简单的递增/递减NSUInteger
(_saveDisabler
),该类通过以下方法进行了修改:
- (void)enableSaves {
if (_saveDisabler > 0) {
_saveDisabler -= 1;
}
}
- (void)disableSaves {
_saveDisabler += 1;
}
然后,我在自定义saveContext
方法中所做的只是在顶部进行简单的检查:
if (([moc hasChanges] == NO) || (_saveDisabler > 0)) {
return YES;
}
这可以防止发生保存,并且意味着不会从我的任何自定义文本字段子类中窃取焦点。为了完整起见,我还将NSTextField子类化,并通过以下方法启用/禁用我的Core Data控制器中的保存:
- (void)textDidBeginEditing:(NSNotification *)notification;
- (void)textDidEndEditing:(NSNotification *)notification;
它可能有点乱,但它对我有用。如果有人以另一种方式成功地做到这一点,我很想听到更干净/更少复杂的方法。