在 NSScrollView 中嵌入字段编辑器
Posted
技术标签:
【中文标题】在 NSScrollView 中嵌入字段编辑器【英文标题】:Embedding a field editor in a NSScrollView 【发布时间】:2012-04-10 23:18:53 【问题描述】:有没有人有过在滚动视图中嵌入字段编辑器(用于 NSTextField)的经验?我正在尝试使 NSTextField 在编辑时可滚动。
我尝试过的事情:
在调用自定义字段编辑器的 -becomeFirstResponder
时动态嵌入它。这个半有效;问题是,当 NSTextField 在编辑期间调整大小时,自定义字段编辑器不再随之调整大小(我需要这个 - 制作手风琴
风格应用)
从 NSScrollView 创建一个“伪装”字段编辑器,并使用 NSInvocation 将方法转发到实际的代理字段编辑器。这是我真正希望可行的方法;我已经实现了here 列出的所有方法;但是每当实际加载字段编辑器时(例如,当我调用 [customTextField selectText:nil]
时),我都会得到一个 EXC_BAD_ACCESS
。即使启用了 Zombies,我似乎也无法从调试器中窥探任何信息,并且查看 NSObjCMessageLoggingEnabled
的日志也一无所获。 these guys 似乎成功了,但那是七年前的事了。
最后的手段是完全放弃 NSTextFields 并使用 NSTextViews (或者不依赖字段编辑器机制,自己编写一个),但是由于我有很多行数据,一次只能编辑一个,我不想为它们中的每一个实例化一个 NSTextView ......但是,也许它不会那么糟糕。
【问题讨论】:
【参考方案1】:我最终使用了选项 1,并且毫不费力地让它工作。选项 2 完全是一条死胡同,因为EXC_BAD_ACCESS
我走到哪里都会弹出来。
我的自定义字段编辑器现在保留对(自定义)滚动视图的引用以将其自身嵌入到(vvScrollView)中,并将其插入到视图层次结构中。我在自定义字段编辑器 (NSTextView) 中的代码用于将其嵌入到滚动视图中,一旦字段编辑器成为第一响应者并自动插入到视图层次结构中,就会调用该滚动视图:
- (void)embedSelfInScrollView
NSView *realSuperview = [[self superview] superview];
// [self superview] is some kind of private NSClipView class
if ([realSuperview isKindOfClass:[NSTextField class]]) // the expected behavior: this may change? TODO make less prone to chance
[realSuperview addSubview:[self vvScrollView]]; // insert into view
[[self vvScrollView] setFrameSize:[realSuperview frame].size]; // se the initial size equivalent to control size so it can autoresize the same way
// add the scrollview into the view hierarchy
[[self vvScrollView] setDocumentView:self]; // removes self from previous superview
我遇到的最初问题是我试图将滚动视图插入到字段编辑器(NSClipView 的私有类)正上方的超级视图中,这破坏了几乎所有自动调整大小选项(因为我希望能够调整 NSTextField 的大小编辑时)。更进一步并绕过私有类似乎可行,但几乎似乎是任意的。
【讨论】:
以上是关于在 NSScrollView 中嵌入字段编辑器的主要内容,如果未能解决你的问题,请参考以下文章
如何在屏幕上实现具有许多文本字段的 NSScrollView?
将 NSPredicateEditor 添加到 NSScrollView 时出现 UI 故障