【问题标题】:Sequential selection among multiple NSTextViews多个 NSTextView 之间的顺序选择
【发布时间】:2013-02-03 00:48:13
【问题描述】:

我有一堆NSTextViews,我想分享一个选择。我基本上希望它的行为类似于在网页上选择文本,其中有多个文本视图,但您可以拖动以在其中顺序选择文本。

我发现this 文档指出,可以有多个NSTextContainer 对象共享一个NSLayoutManager,从而共享选择。这是我想要的一半,除了一个 NSLayoutManager 只能有一个 NSTextStorage 对象。我希望每个文本视图都有自己的NSTextStorage,这样每个文本视图都可以有自己的文本,但我仍然希望能够通过一次拖动在多个文本视图中选择文本。这可能吗?

【问题讨论】:

  • 您是否有幸找到了解决方案?
  • 我写了一个解决方案,看我的回答。

标签: objective-c cocoa nstextview nslayoutmanager nstextcontainer


【解决方案1】:

没有简单的方法可以解决这个问题(正如我试图通过提出这个问题来找到的那样)。它涉及您期望的所有鼠标事件处理和文本选择计算,因此我编写了代码并将其开源为INDSequentialTextSelectionManager

【讨论】:

    【解决方案2】:

    为了使这个单独的文本容器正常工作,您将计算字符串每个部分的绘制大小并将 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.
        }
    }
    

    【讨论】:

    • 抱歉,如果原始帖子不清楚。我不希望在多个文本视图之间同步相同的选择范围,而是顺序选择文本 between 文本视图。我正在寻找这样的东西:d.pr/i/kmnB。在这种情况下,它使用 WebView 并无需任何额外工作即可获得此功能,但我希望仅使用文本视图复制相同的效果。
    • 啊……是的,我明白你的意思了。编辑答案。
    • 感谢您的修改。我实际上已经有多个文本视图在工作并显示我的文本。我的问题具体是选择。如何在 one 文本视图上截取鼠标拖动,并在鼠标拖动到文本视图上方/下方时将选择矩形扩展到其上方/下方的文本视图的选择范围?
    猜你喜欢
    • 2012-09-05
    • 2023-03-23
    • 2012-04-29
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 2019-06-11
    相关资源
    最近更新 更多