0

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

我尝试过的事情:

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

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

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

4

1 回答 1

0

我最终使用了选项 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 的大小) . 更进一步并绕过私人课程似乎可行,但几乎似乎是任意的。

于 2012-04-15T05:20:26.227 回答