2011-09-26 59 views
33

单击某个按钮时,我想显示带有电子邮件+密码提示的工作表,并提供保存和取消选项。用户界面全部设置完毕,操作已到位,表单出现并按预期取消。问题是我无法在运行时编辑任何NSTextFields;它们显示为禁用,并且在打开表单时每次按键都会播放操作系统错误声音。我读到的SO UIActionSheet是合适的,但这不是一个iOS应用程序。无法在运行时在工作表中编辑NSTextField

textfields已启用,并且以前一直在另一个面板中工作。我确定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没有得到关注,也没有像往常一样接收键盘输入。我也忘记提及我的Save按钮调用并正确执行其相关的方法。

回答

35

视图并不一定有标题栏。

Why NSWindow without styleMask:NSTitledWindowMask can not be keyWindow?

其中规定:如果你想有一个titleless窗口能够成为一个重要窗口,你需要创建NSWindow的子类,并覆盖-canBecomeKeyWindow如下:

- (BOOL)canBecomeKeyWindow { 
    return YES; 
} 

这对我有用。

+0

这对我来说很有效,并且使它更容易,因为我由于标题栏而不必重新编码。 – evilgoldfish

+1

这是更好的答案。我不知道他们为什么将这个作为无标题窗口的默认行为,并且是通过委托来控制的,但是我用这个方法使用了一个子类,并且工作正常。 –

+0

这个*可以*在应用程序中通过一个类别被默认设置。看到[这个答案](http://stackoverflow.com/questions/7214273/nstextfield-on-nspopover) – cbedrosian

79

事实证明,我随意找到了解决办法,我现在会后留给后人......

是被其用作片(NSWindow或NSPanel)视图需要有一个标题栏。只要我在界面生成器的检查器(窗口→外观→标题栏复选框)中将其切换,我就会重新编译它,并且NSTextField以突出显示,选项卡形式并接受输入,就像在任何其他视图中一样。不知道为什么标题栏有所作为,但你有它。

+0

非常感谢这个答案,除了NSTokenField,我一直都有同样的问题。我尝试重写所有内容,重做IB中的所有内容,最后发现标题栏是问题所在。我希望这个问题有更好的记录。 –

+0

我也一直有这个问题!我试图用一个不可见的透明窗口与文本字段做屏幕叠加...让我懊恼文本字段不接受输入......这就解释了为什么!万分感谢! –

+0

我有一个类似的问题,其中工作表上的默认NSButton不脉动。这解决了它。 – Mahouk