4

这是我在我的应用程序中看到的一个非常奇怪的问题。我有一个 NSTextField 绑定到 NSManagedObject 的属性,但是每当保存对象时,文本字段就会失去焦点。我不断更新绑定的值,所以这远非理想。

以前有没有人见过这样的事情,并且(希望)找到了解决方案?

4

3 回答 3

5

我最近遇到了这个问题,并通过更改 NSTextField 绑定到 NSManagedObject 属性的方式来修复它。我没有将文本字段的值绑定到 NSArrayController 的 selection.[attribute] 键路径,而是绑定了视图控制器的 arrayController.selection.[attribute] keyPath,该视图控制器具有指向控制器的正确出口。

出于某种原因,如果以这种方式绑定,则保存 NSManagedObjectContext 时 NSTextField 不会失去焦点。

于 2011-09-16T10:14:01.877 回答
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;
}
于 2011-10-30T18:52:09.980 回答
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 子类化并通过以下方法在我的核心数据控制器中启用/禁用保存:

- (void)textDidBeginEditing:(NSNotification *)notification;
- (void)textDidEndEditing:(NSNotification *)notification;

它可能有点混乱,但它对我有用。如果有人以另一种方式成功地做到了这一点,我很想听到更清洁/不那么复杂的方法。

于 2010-09-30T12:10:25.690 回答