NSTextField实现代理方法支持回车与制表符输入的配置问题
问题描述
我正尝试按照苹果官方文章的说明,为NSTextField实现代理方法,目标是让NSTextField支持输入回车与制表符。我知晓包括上述文章在内的诸多资料都推荐使用NSTextView实现该需求,但我当前使用的跨平台框架不支持NSTextView,只要能实现回车输入,NSTextField完全可以满足需求。
参考官方文章编写的代码如下:
@interface MyTextFieldSubclass : NSTextField {} - (BOOL)control:(NSControl*)control textView:(NSTextView*)textView doCommandBySelector:(SEL)commandSelector; @end @implementation MyTextFieldSubclass - (BOOL)control:(NSControl*)control textView:(NSTextView*)textView doCommandBySelector:(SEL)commandSelector { BOOL result = NO; if (commandSelector == @selector(insertNewline:)) { // new line action: // always insert a line-break character and don’t cause the receiver to end editing [textView insertNewlineIgnoringFieldEditor:self]; result = YES; } else if (commandSelector == @selector(insertTab:)) { // tab action: // always insert a tab character and don’t cause the receiver to end editing [textView insertTabIgnoringFieldEditor:self]; result = YES; } return result; } @end
此外我已经在文本框的Identity Inspector中,将默认类从NSTextField修改为自定义的子类,但运行程序时代理方法始终没有被调用,请问在Interface Builder中还需要进行其他配置吗?
解决方案
你实现的control:textView:doCommandBySelector:属于NSControlTextEditingDelegate协议方法,默认NSTextField的代理没有指向自身,所以子类的实现不会被触发,你需要补充以下配置:
Interface Builder 操作步骤:
- 选中你已经修改为自定义子类的
NSTextField实例 - 切换到Connections Inspector(右侧面板的箭头形状图标)
- 找到「Outlets」分类下的
delegate选项,按住选项后方的圆形拖拽锚点,直接拖到当前文本框自身上松开即可完成绑定
替代代码配置方案:
如果不想手动在IB里拖拽,你可以直接在自定义子类的awakeFromNib方法中添加代理绑定代码:
- (void)awakeFromNib { [super awakeFromNib]; self.delegate = self; }
补充优化项:
可以在子类的头文件声明中显式标注遵守代理协议,避免出现编译警告:
@interface MyTextFieldSubclass : NSTextField <NSControlTextEditingDelegate> @end
完成上述配置后,回车、制表符输入的拦截逻辑就可以正常触发。
内容的提问来源于stack exchange,提问作者rpatters1
相关产品推荐
相关产品推荐

