Pregunta

Este es un problema muy extraño que estoy viendo en mi aplicación. Tengo una NSTextField ligado a un atributo de un NSManagedObject, pero cada vez que se guarda el objeto del campo de texto pierde el foco. Estoy actualizando continuamente el valor de la unión, por lo que esto está lejos de ser ideal.

¿Alguien ha visto algo como esto antes, y (con suerte) encontrar una solución?

¿Fue útil?

Solución 3

OK, así que gracias a Martin para señalar que debería leer la documentación de un poco más de cerca. Este es el comportamiento esperado, y esto es lo que hice para conseguir alrededor de él (use su juicio acerca de si esto es apropiado para usted):

guardo el contexto de una vez cada 3 segundos, el control en el inicio si el contexto tiene cualquier cambio antes me molesto en la ejecución del método save: real en mi NSManagedObjectContext. Añadí un simple incrementar / decrementar NSUInteger (_saveDisabler) a mi clase controlador Core de datos que se ha modificado a través de los métodos siguientes:

- (void)enableSaves {
    if (_saveDisabler > 0) {
        _saveDisabler -= 1;
    }   
}

- (void)disableSaves {
    _saveDisabler += 1;
}

A continuación, todo lo que hago en mi método saveContext costumbre es hacer una simple comprobación en la parte superior:

if (([moc hasChanges] == NO) || (_saveDisabler > 0)) {
    return YES;
}

Esto evita el proceso de almacenamiento que se produzcan, y significa que el enfoque no es robado de cualquiera de mis subclases TextField personalizados. Para completar, también subclases NSTextField y activar / desactivar ahorra en mi controlador de datos básicos de los métodos siguientes:

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

Puede ser que sea un poco desordenado, pero funciona para mí. Estoy deseoso de escuchar de limpiador / métodos menos contorneados si alguien ha hecho esto con éxito de otra manera.

Otros consejos

me encontré con el problema recientemente y se fija al cambiar la forma en que el NSTextField estaba atado al atributo NSManagedObject. En lugar de unir el valor del campo de texto para la selección. [Atributo] ruta de la clave de la NSArrayController, I obligado el arrayController.selection. [Atributo] keyPath del controlador de vista que tenía un señalador toma de corriente apropiada al controlador.

Por alguna razón, el NSTextField no se centra suelta cuando el NSManagedObjectContext se guarda si se vincula de esta manera.

Quiero compartir mi solución. Se trabajará para todos los campos sin modificación. He optimizado para el sitio y eliminado algunas comprobación de errores, el registro y el hilo de seguridad.

- (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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top