如何调用 NSCell 的 fieldEditorForView:分配自定义字段编辑器

Posted

技术标签:

【中文标题】如何调用 NSCell 的 fieldEditorForView:分配自定义字段编辑器【英文标题】:How to call NSCell's fieldEditorForView: to assign custom field editor 【发布时间】:2010-12-05 02:00:10 【问题描述】:

我有一个 NSTextView,我想将其用作 NSTextField 的字段编辑器。

由于视图中会有其他不使用自定义字段编辑器的NSTextField,看来我应该使用NSCell的方法

- (NSTextView *)fieldEditorForView:(NSView *)aControlView

我无法思考如何称呼它,但也没有找到任何使用它的例子。

NSCell 的文档说“aControlView”是:

包含需要的单元格的视图 自定义字段编辑器。

我的大脑所说的意思是“这个 NSTextField 所在的视图”,而不是 NSTextField(作为 NSView 的子类)。

NSView *viewTheTextFieldIsIn;
CustomTextView *customTextView subclass of NSTextView (the field editor)
NSTextField *textField

但是:

[[textField cell] fieldEditorForView:customTextView];

对我来说毫无意义,因为它不是 viewForFieldEditor:...而是在 NSCell 上。

会不会有人怜悯我,让我的思想放松?

【问题讨论】:

进一步说明:我使用 fieldEditor 来提供文本补全。该类确实将其作为文本视图正确提供,但单行文本视图与 NSTextField 的外观不同,因此我认为将其用作 NSTextField 的字段编辑器是一个更好的主意。 【参考方案1】:

只是想我会为存档回答这个问题,因为我想我现在明白了, (令人惊讶的睡眠会做什么)。

具体方法调用的用法可以是:

 CustomTextView *customTextView = (CustomTextView *)[[self.textField cell] fieldEditorForView:self.textField];
[customTextView doSomeOtherStuffWithIt];

customTextView 可以通过使用窗口的委托方法作为 fieldEditor:

-(id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)client

其中客户端可以是文本字段。

然后在 textField 上调用 fieldEditorForView 将返回该 CustomTextView。

【讨论】:

据我了解,您不会自己调用该方法。文档中写道:“这是 NSCell 子类的覆盖点,旨在使用自己的自定义字段编辑器。此消息使用 fieldEditor:forObject: 中的 NSWindow 方法发送到 aControlView 的选定单元格。” 此外,NSCell 的 -fieldEditorForView 文档中写道,“从该方法返回非零表示跳过标准字段编辑器查询过程,包括 windowWillReturnFieldEditor:toObject:delegation。”换句话说,通过实现 -fieldEditorForView,甚至不调用窗口委托方法。 感谢普雷斯顿澄清我的错误答案。我现在可以做的是使用窗口的委托方法来检查字段的身份并通过返回子类NSTextView 作为不同的字段编辑器来响应。这似乎有效。

以上是关于如何调用 NSCell 的 fieldEditorForView:分配自定义字段编辑器的主要内容,如果未能解决你的问题,请参考以下文章

NSCell 子类化:绘制 NSProgressIndicator?

NSControl 和 NSCell:以正确的方式管理单元状态

是否可以在 Interface Builder 中设计 NSCell 子类?

核心数据、NSTableColumn 绑定和自定义 NSCell

NSCell 和 NSControl 之间的关系/区别是啥?

核心数据和自定义 NSCell