【问题标题】:TAB in custom NSTextField does not put focus on another control自定义 NSTextField 中的 TAB 不会将焦点放在另一个控件上
【发布时间】:2012-07-06 11:38:33
【问题描述】:

我有一个自定义的 NSTextField,我在其中实现了一些圆角。

按“TAB”键不会转到窗口中的下一个 NSTextField(或可选控件)。奇怪的。为什么会这样做?按下“TAB”时,我需要添加什么特别的东西以使应用程序能够通过其他控件吗?

【问题讨论】:

  • 你会做任何形式的动态窗口或视图替换吗?
  • @trojanfoe,我确实重写了 drawRect: 方法并在其中插入了我自己的代码,该代码绘制在 nstextfield 中的任何 UI 之上。这就是您所说的窗口/视图替换吗?
  • 不,我的意思是你替换窗口中的视图;问题是如果你这样做了,你需要告诉窗口重新计算密钥循环。我认为这可能是stackoverflow.com/questions/2217905/… 的重复
  • 我不相信我正在替换窗口中的视图(没有代码建议这样做),但情况似乎与该 SO 链接中描述的情况相似:我按 TAB,光标变得不可见,再次按 TAB 将选择同一 nstextfield 中的整个文本。我尝试在 drawRect: 中添加 recalculateKeyViewLoop,但没有任何变化。
  • 您可以尝试使用 IB 设置 next item(即显式设置密钥循环而不是依赖于计算它)。同时删除对recalculateKeyViewLoop的调用。

标签: objective-c macos nstextfield nscontrol


【解决方案1】:

希望您以编程方式或在 Xcode 的界面构建器中设置 nextKeyView,如下所示:

【讨论】:

  • 这仍然是同样的问题:制表符只是在外面(不集中在另一个控件中),然后在自定义 nstextfield 里面。 nextKeyView 确实有效,因为视图选项卡上的其他 nstextfields 正确输入输出
  • 我想知道在 Xcode 调试器中在 nextKeyView(或 setNextKeyView)上设置断点是否有帮助?
【解决方案2】:

好像是我的错。

我在 textDidBeginEditing:textDidEndEditing: 的自定义类中合并了委托调用,以便在用户跳出字段时维护占位符文本,但我没有调用相应的超类的方法好吧。

在包括对[super textDidEndEditing...][super textDidBeginEditing...] 的调用后,标签​​工作正常。

【讨论】:

  • 嘿!这篇文章非常有帮助。这个对我有用。我已经在谷歌上搜索了一个小时或更长时间才能找到这篇文章。
【解决方案3】:

我的解决方案不是很好,但很有效:

子类 NSTextView

#import <Cocoa/Cocoa.h>

@interface NMTextView : NSTextView

@end


#import "NMTextView.h"

@implementation NMTextView

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"

- (void)keyDown:(NSEvent *)theEvent{

    switch ([theEvent keyCode]) {
        case 36:{
            if (([theEvent modifierFlags] & NSCommandKeyMask))
                //something for Ctrl+Enter
            else
                [super insertNewlineIgnoringFieldEditor:self];
        }break;

        case 48:
            //[self nextKeyView] = _NSClipViewOverhangView
            //[[self nextKeyView] nextKeyView] = NSTokenField (in my case)
            // or something different
            [[[self nextKeyView] nextKeyView] becomeFirstResponder];
            //also http://stackoverflow.com/a/3008622/1067147
        break;

        case 53:
            [_target performSelector:_actionEsc withObject:self];
        break;

        default:// allow NSTextView to handle everything else
            [super keyDown:theEvent];
        break;
    }
}

#pragma clang diagnostic pop

@end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2012-10-22
    • 2014-02-20
    • 1970-01-01
    • 2011-07-24
    相关资源
    最近更新 更多