在 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 故障

根据表中的行数调整 NSTableView 或 NSScrollView 的大小

NSImageView:水平适应容器宽度,垂直纵横比

使用 Discord.J 编辑嵌入字段

你如何动画滚动和原子缩放?