2012-02-27 17 views
7

Hola a todos,NSTextField no se puede editar en la costumbre NSWindow

Si creo NSTextField en opinión de mi controlador de entonces todo está bien - el campo es editable. Desafortunadamente, tengo que crear NSTextField en una nueva NSWindow personalizada. Mi código a continuación produce un campo que parece sin foco (la selección de texto es gris) y no es editable (sin cursor y sin reacción a las pulsaciones de teclas). Puedo cambiar la selección de texto con el mouse, pero eso es todo.

¿Tengo que habilitar NSWindow para recibir golpes de tecla?

Apreciar su ayuda, --Josef

 NSRect windowRect = [[self.window contentView] frame] ; 
     NSWindow* uiWindow   = [[NSWindow alloc] initWithContentRect:windowRect 
        styleMask:NSBorderlessWindowMask 
        backing:NSBackingStoreBuffered defer:YES]; 
     [uiWindow setBackgroundColor: [NSColor redColor/*clearColor*/]]; 
     [uiWindow setOpaque:NO]; 

     NSView* uiView = [[[NSView alloc] initWithFrame:NSMakeRect(0, 0, windowRect.size.width, windowRect.size.height)] autorelease]; 
     [uiView translateOriginToPoint:NSMakePoint(100, uiView.bounds.size.height/2)]; 
     uiView.wantsLayer = YES; 

     [uiWindow setContentView:uiView]; 

     NSTextField *textField; 
     textField = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 800, 80)]; 
     [textField setFont:[NSFont fontWithName:@"Helvetica Bold" size:60]]; 
     [textField setStringValue:@"My Label"]; 
     [textField setBezeled:YES]; 
     [textField setDrawsBackground:YES]; 
     [textField setEditable:YES]; 
     [textField setSelectable:YES]; 
     [textField setEnabled:YES]; 

     [uiView addSubview:textField]; 


// THIS DOES NOT WORK 
[self.window addChildWindow:uiWindow ordered:NSWindowAbove]; 

// THIS WORKS 
//[_graphicView addSubview:uiView]; 
+0

Acabo de encontrar que es causado por window styleMask NSBorderlessWindowMask. Si uso NSTitledWindowMask, está bien. ¿Hay alguna manera de habilitar el teclado para la ventana sin bordes? –

Respuesta

10

Es necesario para permitir que su ventana personalizada se convierta en la ventana clave. Por defecto, las ventanas sin bordes no pueden convertirse en claves. En su NSWindow subclase, añadir el método canBecomeKeyWindow::

- (BOOL)canBecomeKeyWindow 
{ 
    return YES; 
} 



se puede comprobar si la ventana sin bordes es ventana de llave con esto:

if([uiWindow isKeyWindow] == TRUE) { 
    NSLog(@"isKeyWindow!"); 
} 
else { 
    NSLog(@"It's not KeyWindow!"); 
} 



Además , para que una ventana sin bordes acepte eventos clave, el clas s debe implementar acceptFirstResponder y devolver YES.

+0

Funciona para mí. – Mrug

1

Si solo puede cambiar su styleMask: NSBorderlessWindowMask al estilo: NSTitledWindowMask, el código anterior funcionará. Sin embargo, también intenté agregar TextFields modificables a NSBorderlessWindow, pero tampoco me funcionó.

Cuestiones relacionadas