2011-03-10 5 views
5

Tengo dos clases. ManagingViewController, una subclase de NSViewController y ViewController, una subclase en ManagingViewController. En Viewcontroller tengo un NSTextField que quiero convertirme en el primer Respondedor, pero no lo logré.firstResponder en NSViewController

Por lo tanto, es casi lo mismo que el Capítulo 29 en el libro de Hillegass Cocoa Programming para Mac OS X (Download of the book's examples), excepto un NSTextField que se establece en firstResponder.

¿Alguien me puede indicar el camino correcto?

+0

¿Se puede publicar el código con el que está trabajando? – Tim

+0

Mire los ejemplos del libro (29_ViewSwapping). Solo agregué 'IBOutlet NSTextField * test;' y 'IBOutlet NSTextField * test2;' a DepartmentViewController.hy dos NSTextFields a DepartmentView.nib – lueda

+0

como dije ... usando el constructor de interfaz. puedes configurar fácilmente –

Respuesta

1

¿Has probado [[myTextField window] makeFirstResponder:myTextField];?

+0

Acabo de probar esto en '-awakeFromNib' pero no funciona para mí. El primer Respondedor aún es el campo equivocado. – lueda

+0

¿Has intentado configurar el 'initialFirstResponder' en el plumín? – Richard

+1

Una vista personalizada no tiene initialFirstResponder. Solo tiene una ventana, así que creo que tengo que llamar a la ventana desde NSViewController (como su primera sugerencia). Pero no tengo idea de cómo. – lueda

-3

simple. Ir a su archivo xib en el constructor de interfaz. haga clic derecho en el primer campo de respuesta mostrará la conexión, eliminará la conexión y la conectará al respondedor deseado. hágamelo saber si esto funciona

+0

¡Mira los comentarios en la respuesta de arriba! – lueda

+0

No funciona al menos para osx. – Borzh

6

Debe configurar el campo de texto como el primer respondedor usando -[NSWindow makeFirstResponder:].

Dado que este es un método NSWindow, solo tiene sentido después de haber agregado la vista correspondiente a la ventana, es decir, después de haber agregado la vista como una subvista dentro de la jerarquía de la vista de la ventana. En el ejemplo del libro, esto sucede cuando configura la vista como la vista de contenido del cuadro dentro de la ventana. Por ejemplo:

- (void)displayViewController:(ManagingViewController *vc) { 
    // Try to end editing 
    NSWindow *w = [box window]; 
    … 

    // Put the view in the box 
    NSView *v = [vc view]; 
    [box setContentView:v]; 

    // Set the first responder 
    if ([vc class] == [ViewController class]) { 
     [w makeFirstResponder:[(ViewController *)vc myTextField]]; 
    } 
} 

Esto supone ViewController expone un método getter llamada -myTextField.

Puede hacer esto más genérico haciendo que sus controladores de vista expongan un método que devuelve el objeto que el controlador de vista recomienda como el primero en responder. Algo así como:

@interface ManagingViewController : NSViewController 
… 
- (NSResponder *)recommendedFirstResponder; 
@end 

@implementation ManagingViewController 
… 
- (NSResponder *)recommendedFirstResponder { return nil; } 
@end 

Y, en sus subclases concretas de ManagingViewController, tienen -recommendedFirstResponder retorno del objeto que debe ser de primera respuesta de la ventana:

@implementation ViewController 
… 
- (NSResponder *)recommendedFirstResponder { return myTextField; } 
@end 

Una vez hecho esto, puede cambiar su -displayViewController: a algo como:

- (void)displayViewController:(ManagingViewController *vc) { 
    // Try to end editing 
    NSWindow *w = [box window]; 
    … 

    // Put the view in the box 
    NSView *v = [vc view]; 
    [box setContentView:v]; 

    // Set the first responder 
    NSResponder *recommendedResponder = [vc recommendedFirstResponder]; 
    if (recommendedResponder) [w makeFirstResponder:recommendedResponder]; 
} 
+0

Esto es * exactamente * lo que estaba buscando. Lo implementé en mi NSViewController, y funciona. Lo hice como @opcional, sin embargo, ya que no todos mis puntos de vista se preocupan por que un campo se convierta en el primero en responder. – SilverSideDown

Cuestiones relacionadas