在多个NSTextViews中进行顺序选择

7
我有一堆NSTextView,我想让它们共享一个选择。 我基本上希望这像在网页上选择文本一样,其中有多个文本视图,但您可以拖动以顺序地选择文本。
我找到了此文档,它指出可以让多个NSTextContainer对象共享单个NSLayoutManager,从而共享选择。 这是我想要的一半,除了一个NSLayoutManager只能具有单个NSTextStorage对象的事实。 我希望每个文本视图都有自己的NSTextStorage,以便每个文本视图都可以拥有自己的文本,但我仍然希望能够使用一个拖动在多个文本视图中选择文本。 是否有可能?

你有没有找到解决这个问题的办法? - dl.
我写了一个解决方案,请看我的回答。 - indragie
2个回答

4

解决这个问题并不是一个简单的任务(我试着通过问这个问题来寻找答案)。它涉及到所有你所期望的鼠标事件处理和文本选择计算,因此我编写了代码,并将其开源在INDSequentialTextSelectionManager中。


0
为了使这些独立的文本容器起作用,您需要计算字符串的每个部分的绘制大小,并将NSTextView限制在该大小范围内。
    NSLayoutManager * layout = [[NSLayoutManager alloc] init];
    NSString * storedString = @"A\nquick\nBrown\nFox";
    NSTextStorage * storage = [[NSTextStorage alloc] initWithString:storedString];
    [storage addLayoutManager:layout];

    //I assume you have a parent view to add the text views
    NSView * view;

    //Assuming you want to split up into separate view by line break
    NSArray * paragraphs = [storedString componentsSeparatedByString:@"\n"];
    for (NSString * paragraph in paragraphs)
    {
        NSSize paragraphSize = [paragraph sizeWithAttributes:@{}];
        //Create a text container only big enough for the string to be displayed by the text view
        NSTextContainer * paragraphContainer = [[NSTextContainer alloc] initWithContainerSize:paragraphSize];
        [layout addTextContainer:paragraphContainer];

        //Use autolayout or calculate size/placement as you go along
        NSRect lazyRectWithoutSizeOrPlacement = NSMakeRect(0, 0, 0, 0);
        NSTextView * textView = [[NSTextView alloc] initWithFrame:lazyRectWithoutSizeOrPlacement
                                                    textContainer:paragraphContainer];
        [view addSubview:textView];
    }

您可以将委托添加到NSLayoutManager中,以监视您的文本容器使用情况:
- (void)layoutManager:(NSLayoutManager *)aLayoutManager
didCompleteLayoutForTextContainer:(NSTextContainer *)aTextContainer
                    atEnd:(BOOL)flag
{
    if (aTextContainer == nil)
    {
        //All text was unable to be displayed in existing containers. A new NSTextContainer is needed.
    }
}

如果原帖不够清晰,我表示歉意。我不是要在多个文本视图之间同步相同的选择范围,而是按顺序选择文本 文本视图之间。我正在寻找像这样的东西:http://d.pr/i/kmnB。在那种情况下,它使用了一个 WebView,并且不需要任何额外的工作就获得了这个功能,但我想用文本视图复制相同的效果。 - indragie
啊..是的,我明白你的意思。正在编辑答案。 - Fruity Geek
1
感谢您的修改。实际上,我已经有多个文本视图在工作并显示我的文本。我的问题是具体涉及到选择。当鼠标拖动时,如何拦截对一个文本视图的鼠标拖动,并使选择矩形扩展到其上方/下方的文本视图的选择范围? - indragie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接