2009-05-27 15 views
10

Tengo una celda de campo de texto en una vista de tabla, de la cual necesito que sepan cuándo termina la edición. Pensé que establecería mi clase Controller como delegado de la celda del campo de texto y luego usaré el método de delegado NSTextField textDidEndEditing :, pero me di cuenta de que la celda de campo de texto no parece tener métodos de delegado. ¿Por qué esto y qué puedo hacer (aparte de la subclasificación) para estar informado cuando finaliza la edición?NSTextFieldCell Delegado?

Gracias

Respuesta

14

NSTextFieldCell hereda de NSCell (bueno, técnicamente de NSActionCell que hereda de NSCell). La clase NSCell se utiliza para (a partir de la docs):

La clase NSCell proporciona un mecanismo para la visualización de texto o imágenes en un objeto NSView sin la sobrecarga de una subclase completo NSView.

En particular, la clase de células se utiliza para "mostrar texto o imágenes", y no se trata de la interacción con el usuario. Del mismo modo, con la clase NSTextField:

La clase NSTextField utiliza la clase NSTextFieldCell para implementar su interfaz de usuario.

Los NSTextField se ocupa de la entrada del usuario real, mientras que el uso de la célula campo de texto para simplemente poner en práctica su interfaz de usuario, y de manera similar, los métodos de delegado para proporcionar una notificación cuando la edición de texto ha terminado se proporciona a través de la clase NSTextField y no a través de la clase NSTextFieldCell.

Si desea ser notificado cuando termina la edición en un NSTableView, entonces es necesario que se registre como un observador de la NSTextDidEndEditingNotification (es posible que desee leer la referencia NSNotificationCenter clase si no está familiarizado con las notificaciones). Para hacer esto, coloque lo siguiente en su clase de controlador; la función awakeFromNib es un buen lugar para incluirlo para asegurar que se llama en el inicio de su aplicación:

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
[nc addObserver:self 
     selector:@selector(textDidEndEditing:) 
      name:NSTextDidEndEditingNotification 
     object:tableView]; 

Dónde tableView es el puntero al objeto NSTableView. Luego, basta con aplicar el método de la siguiente manera:

- (void)textDidEndEditing:(NSNotification *)aNotification 
{ 
    // Do what you want here 
} 

No se olvide de eliminar a sí mismo como un observador sobre cancelación de asignación:

- (void)dealloc 
{ 
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
    [nc removeObserver:self]; 
} 

La razón por la que se establece el objeto que se está observando a ser el NSTableView instancia (y no la celda en sí) es que debajo del capó, cuando edita una celda en la tabla, la celda con la que está tratando no se está editando directamente; es el editor de campo de la ventana (o un personalizado). Cuando termina la edición, el editor de campo pasa el nuevo valor de esa celda a la vista de tabla. Sin embargo, la vista de tabla publicará una notificación para decir que una celda ha terminado de editarse.

+0

Encontré que el método "TextDidEndEditing:" funciona, pero no el método "TextDidBeginEditing:". ¿Tiene alguna idea? – Yun

0

Implemente el método tableView:setObjectValue:forTableColumn:row: en el protocolo NSTableViewDataSource. Colóquelo junto al método tableView:objectValueForTableColumn:row: que ya ha implementado.

- (void)tableView:(NSTableView *)aTableView 
    setObjectValue:(id)anObject 
    forTableColumn:(NSTableColumn *)aTableColumn 
       row:(NSInteger)rowIndex 
{ 
    [mutableArrayWithStrings replaceObjectAtIndex:rowIndex withObject:anObject]; 
}