2012-02-27 10 views
7

Ciao a tutti,NSTextField non modificabile in costume NSWindow

Se creo NSTextField in vista del mio controller allora tutto va bene - il campo è modificabile. Sfortunatamente, devo creare NSTextField nella nuova NSWindow personalizzata. Il mio codice muggito produce un campo che sembra senza messa a fuoco (la selezione del testo è grigia) e non è modificabile (nessun cursore e nessuna reazione ai tratti dei tasti). Posso cambiare la selezione del testo con il mouse, ma questo è tutto.

Devo abilitare NSWindow per ricevere i colpi di chiave?

Apprezziamo il vostro aiuto, --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

Ho appena scoperto che è causato dalla finestra styleMask NSBorderlessWindowMask. Se uso NSTitledWindowMask, allora va bene. C'è un modo per abilitare la tastiera per la finestra senza bordi? –

risposta

10

È necessario consentire la vostra finestra personalizzata di diventare finestra chiave. Per impostazione predefinita, le finestre senza bordi non possono diventare chiave. Nella tua NSWindow sottoclasse, aggiungere il metodo canBecomeKeyWindow::

- (BOOL)canBecomeKeyWindow 
{ 
    return YES; 
} 



è possibile controllare se la finestra senza bordi è la finestra chiave con questo:

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



Inoltre , per una finestra senza bordi accettare eventi chiave, i clas s dovrebbe implementare acceptFirstResponder e restituire YES.

+0

Funziona per me. – Mrug

1

Se è possibile modificare solo lo stile maschera: NSBorderlessWindowMask per lo stile: NSTitledWindowMask, il codice sopra funzionerà. Comunque ho anche provato ad aggiungere TextFields modificabili a NSBorderlessWindow, ma non sembrava funzionare neanche per me.