NSTextField не редактируется в пользовательском NSWindow - PullRequest
9 голосов
/ 27 февраля 2012

Привет всем,

Если я создаю NSTextField в виде моего контроллера, то все в порядке - поле доступно для редактирования. К сожалению, я должен создать NSTextField в новом пользовательском NSWindow. Мой код ниже создает поле, которое выглядит как без фокуса (выделение текста серым) и не редактируется (без курсора и без реакции на нажатия клавиш). Я могу изменить выделение текста с помощью мыши, но это все.

Нужно ли включать NSWindow для получения нажатий клавиш?

Ценю вашу помощь, - 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];

Ответы [ 2 ]

11 голосов
/ 27 февраля 2012

Вам нужно, чтобы ваше пользовательское окно стало ключевым.По умолчанию окна без полей не могут стать ключевыми.В вашем подклассе NSWindow добавьте метод canBecomeKeyWindow::

- (BOOL)canBecomeKeyWindow
{
    return YES;
}


Вы можете проверить, является ли ваше окно без полей ключевым окном с помощью:

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

Кроме того, чтобы окно без границ могло принимать ключевые события, класс должен реализовать acceptFirstResponder и вернуть YES.

1 голос
/ 20 августа 2012

Если вы можете просто изменить свой styleMask: NSBorderlessWindowMask на style: NSTitledWindowMask, вышеуказанный код будет работать. Однако я также попытался добавить редактируемые TextFields в NSBorderlessWindow, но мне это тоже не помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...