【问题标题】:can't edit NSTextField in sheet at runtime运行时无法在工作表中编辑 NSTextField
【发布时间】:2011-09-26 21:08:36
【问题描述】:

单击按钮时,我想显示一个带有电子邮件+密码提示的工作表,其中包含保存和取消选项。 UI 已全部设置完毕,操作到位,工作表按预期出现并取消。问题是我无法在运行时编辑任何一个 NSTextField;它们似乎已禁用,并且当工作表打开时,每次按键都会播放操作系统错误声音。我在 SO 上读到 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 没有获得焦点,也没有像往常一样接收键盘输入。我也忘了提到我的保存按钮正确调用并执行了它的相关方法。

【问题讨论】:

    标签: objective-c cocoa nstextfield


    【解决方案1】:

    原来我偶然找到了解决方案,我现在将其发布给后代......

    用作工作表的视图(NSWindow 或 NSPanel)需要有一个标题栏。只要我在 Interface Builder 的检查器中切换它(窗口 → 外观 → 标题栏复选框),我重新编译并且 NSTextFields 像在任何其他视图中一样突出显示、选项卡并接受输入。不知道为什么标题栏会有所不同,但你有它。

    【讨论】:

    • 非常感谢您的回答,除了 NSTokenField 之外,我遇到了完全相同的问题。我尝试重写所有内容,重做IB中的所有内容,最后发现标题栏是问题所在。我希望这个问题得到更好的记录。
    • 我也一直有这个问题!我试图使用一个不可见的透明窗口来对文本字段进行屏幕覆盖......令我懊恼的是,文本字段不接受输入......这解释了为什么!非常感谢!
    • 我遇到了类似的问题,即工作表上的默认 NSButton 没有跳动。这解决了它。
    • 好吧,我已经阅读了更多关于那件事的内容……这不是错误,而是它的工作方式,但删除将用作工作表的窗口中的标题栏是有意义的。将 YES 返回到 canBecomeKeyWindow 可能是另一种解决方案,但我倾向于在不需要时不进行子类化。很抱歉重复消息,但我迟到了修改之前的回复,我想声明这不是错误。
    • -canBecomeKeyWindow 覆盖似乎更正确,但这里的答案更实用:))
    【解决方案2】:

    视图不一定要有标题栏。

    Why NSWindow without styleMask:NSTitledWindowMask can not be keyWindow?

    其中规定:如果希望无标题窗口能够成为关键窗口,则需要创建 NSWindow 的子类并覆盖 -canBecomeKeyWindow,如下所示:

    - (BOOL)canBecomeKeyWindow {
        return YES;
    }
    

    这对我有用。

    【讨论】:

    • 这对我有用,而且因为标题栏我不必重新编码,所以更容易。
    • 这是更好的答案。我不知道为什么他们将其设为无标题窗口的默认行为,并且无法通过委托进行控制,但我使用了具有这种方法的子类,并且一切正常。
    • 这个可以通过一个类别在你的应用程序中设置为默认值。见this answer
    • 在 Swift 中,没有自动完成来覆盖 canBecomeKeyWindow,但是继承 NSWindow 并实现这个功能就像一个魅力。非常感谢。
    猜你喜欢
    • 2011-11-05
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 2014-06-16
    • 2011-03-27
    • 1970-01-01
    • 2018-02-17
    相关资源
    最近更新 更多