Pregunta

En Aaron Hillegass' Cacao programación para Mac OS X , capítulo 9, la sección denominada "iniciar la edición en Insertar", que explica cómo hacer exactamente eso. Lo que me confunde sin embargo, fue lo que hizo un montón de otras cosas. Aquí está la lista completa de códigos:

- (IBAction)createEmployee:(id)sender
{
NSWindow *w = [tableView window];

// Try to end any editing that is taking place
BOOL editingEnded = [w makeFirstResponder:w];
if (!editingEnded) {
    NSLog(@"Unable to end editing");
    return;
}
NSUndoManager *undo = [self undoManager];

// Has an edit occurred already in this event?
if ([undo groupingLevel]) {
    // Close the last group
    [undo endUndoGrouping];
    // Open a new group
    [undo beginUndoGrouping];
}
// Create the object
Person *p = [employeeController newObject];

// Add it to the content array of 'employeeController'
[employeeController addObject:p];
[p release];
// Re-sort (in case the user has sorted a column)
[employeeController rearrangeObjects];

// Get the sorted array
NSArray *a = [employeeController arrangedObjects];

// Find the object just added
int row = [a indexOfObjectIdenticalTo:p];
NSLog(@"starting edit of %@ in row %d", p, row);

// Begin the edit in the first column
[tableView editColumn:0
                  row:row
            withEvent:nil
               select:YES];
}

Tengo dos preguntas con respecto a esto:

1) ¿Cómo sabe que se supone que debes hacer todo eso? ¿Hay una lista de control o algo en el documento de Apple? Experiencia?

2) No esta derrota el propósito entero de un controlador de array si está teniendo que todavía reescribir todos los métodos por su cuenta?

EDIT: Estoy preguntando sobre todo ¿Cómo que sabía que era poner estas líneas en: (ya que todo lo demás es bastante básico y obvio)

NSWindow *w = [tableView window];

// Try to end any editing that is taking place
BOOL editingEnded = [w makeFirstResponder:w];
if (!editingEnded) {
    NSLog(@"Unable to end editing");
    return;
}
NSUndoManager *undo = [self undoManager];

// Has an edit occurred already in this event?
if ([undo groupingLevel]) {
    // Close the last group
    [undo endUndoGrouping];
    // Open a new group
    [undo beginUndoGrouping];
}
¿Fue útil?

Solución

  

1) ¿Cómo sabe que se supone que debes hacer todo eso? ¿Hay una lista de control o algo en el documento de Apple? Experiencia?

Tiene razón, que el código no ocurriría a la mayoría de la gente que hace una implementación inicial. (Supongo que es por eso que está en el libro. Tienes la oportunidad de beneficiarse de la experiencia de Aaron).

Ese código habría llegado como resultado de uno o más informes de errores. En otras palabras, usted no llegar a ese código al principio, pero con el tiempo.

Pruébelo usted mismo. Quitar ese código a continuación, ver si puede detectar los problemas en la aplicación en ejecución. La solución de esos problemas requiere una combinación de conocimientos y habilidades SDK de depuración. Ambos crecen con la experiencia.

  

2) No esta derrota el propósito entero de un controlador de array si está teniendo que todavía reescribir todos los métodos por su cuenta?

Se podría argumentar que la capacidad de modificar el comportamiento de la tableview como que es el punto central de la controladora de la matriz (como un elemento de diseño de la aplicación).

Otros consejos

1) que está haciendo las cosas que implementar las funcionalidades de su programa requiere. No es tanto una cosa de Apple (como qué métodos delegado tengo que poner en práctica cuando se adhiere a tal y tal protocolo) pero esto es flujo de su programa . Probablemente hay un millón de maneras de resolver este problema.

2) No está seguro de lo que quieres decir, pero parece que está utilizando una gran cantidad de construido en métodos - Yo no lo veo realmente re-inventar la rueda (ejemplo:)

Person *p = [employeeController newObject];

// Add it to the content array of 'employeeController'
[employeeController addObject:p]; // <-- built in method
[p release]; // <-- built in method
// Re-sort (in case the user has sorted a column)
[employeeController rearrangeObjects]; // <-- built in method

// Get the sorted array
NSArray *a = [employeeController arrangedObjects]; // <-- built in method

// Find the object just added
int row = [a indexOfObjectIdenticalTo:p]; // <-- built in method

Editar

Ok, por lo que para el primer mensaje a w, [w makeFirstResponder: w]; podemos encontrar desde aquí ( http: //developer.apple...NSWindow/makeFirstResponder ) que una instancia de NSWindow apoya el mensaje makeFirstResponder. Mi comprensión de hacerlo a NSWindow es para que cuando el usuario interactúa con él, será el primero en responder, en otras palabras, que va a recibir cualquier acción para el NSWindow. Y por ella, me refiero a 'w'.

  

1) ¿Cómo sabe que se supone que debes   hacer todas esas cosas? Hay un   'Lista de control' o algo en Apple   ¿Doc? Experiencia?

Gran pregunta - Creo que viene con la experiencia y el trabajo con todos los diferentes tipos de clases y controles de interfaz de usuario. je =] No sé ... tal vez alguien tiene una mejor respuesta. Me encanta aprender!

Se han encontrado un vínculo bueno: http://www.cocoadev.com/index.pl? FirstResponder

Creo que lo más probable que la implementó sin esas líneas, había problemas de deshacer, y se depura y se fijaron los problemas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top