Pregunta

Tengo varias clases diferentes en mi código utilizando métodos idénticos - que resulta en una gran cantidad de líneas duplicadas - y recientemente se enteró de la adición de categorías que promete una solución eficaz al problema. Para dar uno de los ejemplos más pequeños, mis métodos anteriores fueron (por lo general) llaman a la manera tradicional como esto:

if((thisNum=[self valueInTextField:ctr]) != 0)
    //... do stuff here...

- (int)valueInTextField:(int)tagNum
{
    NSTextField *field = [[prizeWindow contentView] viewWithTag:tagNum];
    int value = [field intValue];

    return value;
}

I elimina el método anterior y se añade la Categoría:

@implementation NSTextField(GetFieldValue)
- (int)valueInTextField
{
    NSTextField *field = [[[self window] contentView] viewWithTag:tagNum]; // DOESN'T LIKE THIS!!
    return [self intValue];
}
@end

Sin embargo, no es así como yo pidiéndole que ir a buscar la propia textField usando [[ventana de auto] contentView], por lo que la única manera que puedo conseguir que funcione es (obviamente) eliminar la línea en cuestión y pasar algo como:

if([[[[self window]contentView]viewWithTag:ctr] valueInTextField] != 0)

Estoy seguro de que puede ver lo que estoy tratando de lograr aquí. ¿Hay alguna manera de obtener una categoría para identificar el campo requerido como insinuado anteriormente - es decir, sin pasar físicamente a mí mismo? Gracias de antemano: -)

¿Fue útil?

Solución

Si ves que necesitas para ese método una gran cantidad de ventanas o controladores de ventanas, el lugar adecuado para poner su categoría sería en una de esas clases. Por ejemplo:

@implementation NSWindow(GetFieldValue)
- (int)valueInTextFieldWithTag:(int)tag
{
  NSTextField *field = [[self contentView] viewWithTag:tag];
  return [field intValue];
}
@end

Otros consejos

  

Sin embargo, no es así como yo pidiéndole   para ir a buscar el campo de texto en sí usando   [[Ventana de auto] contentView]

Se añade un método - (int)valueInTextField a cada NSTextField a través de la categoría.
Como valueInTextField es un método de instancia, ya que necesita un objeto de campo de texto para llamarlo.
No tiene ningún sentido para buscar un campo de texto dentro del propio campo de texto. (Pollo y huevo dilema)

- (int)valueInTextField
{
    NSTextField *field = [[[self window] contentView] viewWithTag:tagNum]; // DOESN'T LIKE THIS!!
    return [self intValue];
}

Como se explicó anteriormente, la búsqueda de la área de texto que aquí no funcionará como ya se encuentra en el campo de texto.
Aparte de que no se está utilizando la variable de campo aquí de todos modos.

¿Cuántos campos de texto tiene?
Probablemente sería más fácil de administrar sus campos de texto con Ivars y puntos de venta en lugar de buscar en ellas por etiqueta.

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