无法在运行时编辑Sheet中的NSTextField

34
点击按钮后,我想显示一个带有电子邮件+密码提示的表格,并提供保存和取消选项。UI已经设置好了,操作也到位了,表格出现并按预期被取消。问题在于,我无法在运行时编辑任何NSTextField;它们似乎被禁用了,在表格打开时每次键盘按键都会播放操作系统错误声音。我在StackOverflow上读到UIActionSheet是合适的,但这不是iOS应用程序。

文本字段是启用的,并且之前在另一个面板中工作过。我确保IBAction链接完整,但我甚至不知道如何进行故障排除。

为什么表格会导致健康的NSTextField拒绝输入?

// show the sheet
-(IBAction)showAccount:(id)sender {
    [NSApp beginSheet:accountWindow 
       modalForWindow:prefsWindow
        modalDelegate:self 
       didEndSelector:NULL 
          contextInfo:NULL];
}

// cancel/hide the sheet
-(IBAction)cancelAccount:(id)sender {
    [NSApp endSheet:accountWindow];
    [accountWindow orderOut:nil];   
}

编辑:我刚刚发现我可以右键粘贴文本到每个字段,但我不能选择或删除。似乎NSTextFields没有得到焦点,也没有像通常一样接收键盘输入。我还忘记提到我的保存按钮能够正确地调用并执行其相关方法。

2个回答

83

原来我偶然找到了解决方案,现在我将其发布以供后人参考...

被用作工作表(NSWindow或NSPanel)的视图需要有一个标题栏。只要我在Interface Builder的检查器(Window → Appearance → Title Bar 复选框)中切换此选项,重新编译后NSTextField就可以像在任何其他视图中一样高亮、切换和接受输入。不确定为什么标题栏会有影响,但事实就是如此。


感谢你提供的答案,我遇到了完全相同的问题,只不过是在NSTokenField上。我尝试了重新编写所有内容,重新在IB中制作所有内容,最终发现标题栏是问题所在。我希望这个问题能够有更好的文档说明。 - Keshav Saharia
我也遇到了这个问题!我试图使用一个透明的无形窗口来进行屏幕叠加,带有文本字段...令人沮丧的是,文本字段不能接受输入...这解释了原因!非常感谢! - Georges Oates Larsen
我曾经遇到过类似的问题,即工作表上的默认NSButton没有脉冲。这个解决了它。 - user376845
我已经阅读了更多关于那个问题的内容...它不是一个错误,而是它的工作方式,但在将窗口用作表单时删除标题栏是有意义的。返回YES到canBecomeKeyWindow可能是另一种解决方案,但我倾向于在不必要的情况下不使用子类化。对于重复的消息,我很抱歉,但我来晚了,无法修改之前的回复,并且我想说明这不是一个错误。 - Sergi Ramón
-canBecomeKeyWindow的重写似乎更正确,但这里的答案更实用:)) - Jerry Krinock
谢谢@JerryKrinock,那只是因为我的Mac开发水平还比较基础 :) - Matt Stein

42

这对我很有效,因为我不需要重新编码标题栏,使得工作更加轻松。 - epetousis
1
这是更好的答案。我不知道为什么他们将此设置为无标题窗口的默认行为,并且不能通过委托进行控制,但我使用了一个子类和这个方法,事情运作得很好。 - Chris R
这可以通过类别在您的应用程序中设置为默认值。请参见此答案 - cbedrosian
在Swift中,没有自动完成覆盖canBecomeKeyWindow的功能,但是通过子类化NSWindow并实现此函数可以完美解决。非常感谢。 - Blackus

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