自定义NSWindow中的NSTextField无法编辑

12

大家好:

如果我在控制器的视图中创建NSTextField,那么一切都很好 - 字段是可编辑的。 不幸的是,我必须在新的自定义NSWindow中创建NSTextField。我的代码如下所示,产生的字段看起来没有聚焦(文本选择是灰色的)并且无法编辑(没有光标和键盘输入反应)。我可以用鼠标改变文本选择,但只有这些。

我需要启用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
我刚发现这是由于窗口样式掩码NSBorderlessWindowMask引起的。如果我使用NSTitledWindowMask,那么就没问题了。有没有一种方法可以为无边框窗口启用键盘? - PerfectGamesOnline.com
2个回答

15

您需要允许您的自定义窗口成为键窗口。默认情况下,无边框窗口不能成为键窗口。在您的NSWindow子类中,添加方法canBecomeKeyWindow::

- (BOOL)canBecomeKeyWindow
{
    return YES;
}

您可以使用以下方法检查无边框窗口是否为关键窗口:

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



另外,为了使无边框窗口能够接收键盘事件,该类应实现acceptFirstResponder并返回YES


2
如果您只需将styleMask:NSBorderlessWindowMask更改为style:NSTitledWindowMask,则上述代码将起作用。但是,我也尝试将可编辑的文本字段添加到NSBorderlessWindow中,但似乎对我也没有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接