【问题标题】:Embedding a field editor in a NSScrollView在 NSScrollView 中嵌入字段编辑器
【发布时间】:2012-04-10 23:18:53
【问题描述】:

有没有人有过在滚动视图中嵌入字段编辑器(用于 NSTextField)的经验?我正在尝试使 NSTextField 在编辑时可滚动。

我尝试过的事情:

  1. 在调用自定义字段编辑器的 -becomeFirstResponder 时动态嵌入它。这个半有效;问题是,当 NSTextField 在编辑期间调整大小时,自定义字段编辑器不再随之调整大小(我需要这个 - 制作手风琴 风格应用)

  2. 从 NSScrollView 创建一个“伪装”字段编辑器,并使用 NSInvocation 将方法转发到实际的代理字段编辑器。这是我真正希望可行的方法;我已经实现了here 列出的所有方法;但是每当实际加载字段编辑器时(例如,当我调用 [customTextField selectText:nil] 时),我都会得到一个 EXC_BAD_ACCESS。即使启用了 Zombies,我似乎也无法从调试器中窥探任何信息,并且查看 NSObjCMessageLoggingEnabled 的日志也一无所获。 these guys 似乎成功了,但那是七年前的事了。

最后的手段是完全放弃 NSTextFields 并使用 NSTextViews (或者不依赖字段编辑器机制,自己编写一个),但是由于我有很多行数据,一次只能编辑一个,我不想为它们中的每一个实例化一个 NSTextView ......但是,也许它不会那么糟糕。

【问题讨论】:

    标签: objective-c cocoa nstextfield fieldeditor


    【解决方案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 的大小编辑时)。更进一步并绕过私有类似乎可行,但几乎似乎是任意的。

    【讨论】:

      猜你喜欢
      • 2020-08-09
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      相关资源
      最近更新 更多