在NSScrollView中嵌入字段编辑器

时间:2012-04-10 23:18:53

标签: objective-c cocoa nstextfield fieldeditor

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

我尝试过的事情:

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

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

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

1 个答案:

答案 0 :(得分: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的私有类)正上方的superview中,这几乎打破了每个自动调整大小选项(因为我希望能够调整NSTextField的大小)在编辑时)。更进一步,绕过私人课程似乎有效,但几乎似乎是武断的。