2012-02-27 11 views
7

Hi everyone,NSTextField nie można edytować w zwyczaju NSWindow

Jeśli tworzę NSTextField w świetle mojego sterownika wtedy wszystko jest w porządku - pole edycji. Niestety, muszę utworzyć NSTextField w nowym niestandardowym NSWindow. Mój kod poniżej tworzy pole, które wygląda jak bez fokusa (zaznaczenie tekstu jest szare) i nie można go edytować (nie ma kursora i nie ma reakcji na naciśnięcia klawiszy). Mogę zmienić zaznaczenie tekstu za pomocą myszy, ale to wszystko.

Czy muszę włączyć NSWindow, aby odebrać naciśnięcia klawiszy?

wdzięczni za pomoc, --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

Po prostu stwierdziłem, że jest to spowodowane przez window styleMask NSBorderlessWindowMask. Jeśli używam NSTitledWindowMask, to jest w porządku. Czy istnieje sposób włączenia klawiatury dla okna bez obramowania? –

Odpowiedz

10

Trzeba umożliwić okno zwyczaj, by stać się kluczowym okno. Domyślnie okna bez obramowania nie mogą stać się kluczem. W swojej NSWindow podklasy, dodać metodę canBecomeKeyWindow::

- (BOOL)canBecomeKeyWindow 
{ 
    return YES; 
} 



Można sprawdzić, czy okna bez obramowania jest kluczem okno z tym:

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



więcej , dla okna bez ramki, aby zaakceptować kluczowe zdarzenia, klasy s powinien wdrożyć acceptFirstResponder i zwrócić YES.

+0

To działa dla mnie. – Mrug

1

Jeśli możesz po prostu zmienić swój stylMask: NSBorderlessWindowMask do stylu: NSTitledWindowMask, powyższy kod zadziała. Jednak próbowałem również dodać edytowalne TextFields do NSBorderlessWindow, ale to też nie działa dla mnie.

Powiązane problemy