在NSScrollView(Swift)中显示文本

时间:2014-08-07 09:33:08

标签: xcode swift nsscrollview nsmutableattributedstring

刚开始学习Swift并创建了一个小macOS应用程序,我想在其中使用NSScrollView来显示属性String。我试过了:

@IBOutlet var ScrollViewOutlet : NSScrollView
var attributedString = NSMutableAttributedString(string: myText)
ScrollViewOutlet.insertText(attributedString)

但这似乎不起作用。我发现有点令人困惑,因为与NSTextView做同样的事情就像魅力一样。

我在这里缺少什么?

7 个答案:

答案 0 :(得分:9)

在下面的示例中,我在界面构建器中添加了scrollView作为我的起点。

如果您的scrollView / textView为空/空白,或者如果您需要在scrollView / textView中已有的文本前添加文本,则以下情况有效。如果框中已有文本,则新文本将插入现有文本的前面。

documentView是一个NSTextView

Swift 4.0

Active Qt

答案 1 :(得分:6)

似乎Xcode的早期测试版(以Swift为特色)在这类插座上存在一些严重问题(正如你在这里看到的那样:http://swiftwtf.tumblr.com/post/88387419568/nstextview)。 但是,自Xcode 6 Beta 6起作用。

textFieldOutlet.textStorage.mutableString.setString("Hello w0rld!")

要处理字符串,为textField而不是scrollView本身创建出口也是一种更好的做法。

答案 2 :(得分:5)

Apple有一篇关于以编程方式在滚动视图中设置文本视图的文章。 Text System User Interface Layer Programming Guide: Putting an NSTextView Object in an NSScrollView您应该阅读以获得最大的理解,但这里是代码:

NSScrollView *scrollview = [[NSScrollView alloc] initWithFrame:[[theWindow contentView] frame]];
NSSize contentSize = [scrollview contentSize];

[scrollview setBorderType:NSNoBorder];
[scrollview setHasVerticalScroller:YES];
[scrollview setHasHorizontalScroller:NO];
[scrollview setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];

theTextView = [[NSTextView alloc] initWithFrame:NSMakeRect(0, 0, contentSize.width, contentSize.height)];
[theTextView setMinSize:NSMakeSize(0.0, contentSize.height)];
[theTextView setMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)];
[theTextView setVerticallyResizable:YES];
[theTextView setHorizontallyResizable:NO];
[theTextView setAutoresizingMask:NSViewWidthSizable];

[[theTextView textContainer] setContainerSize:NSMakeSize(contentSize.width, FLT_MAX)];
[[theTextView textContainer] setWidthTracksTextView:YES];
[scrollview setDocumentView:theTextView];
[theWindow setContentView:scrollview];
[theWindow makeKeyAndOrderFront:nil];
[theWindow makeFirstResponder:theTextView];

然后,您可以通过对其textStorage对象进行操作来设置文本视图的文本:

theTextView.textStorage.attributedString = attributedString;

答案 3 :(得分:2)

回答ixany工作得很好,但作为一个初学者,它看起来我有更多的时间来弄明白,那个插座应该是针对NSTextView而不是针对NSTextScroll。 NSTextView隐藏在NSTextScroll中。 All Results Field is NSTextScroll in my case and Text View Results is NSTextView

答案 4 :(得分:2)

@IBOutlet weak var scrollView: NSScrollView!

documentView中的NSScrollViewNSTextView,因此在Swift中,您可以使用以下代码:

let textView : NSTextView? = scrollView?.documentView as? NSTextView
textView?.string = text

答案 5 :(得分:1)

对于NSScrollView:

@IBOutlet weak var textScroll: NSScrollView!

检查出来:

let text = textScroll.documentView!.textStorage!!
let attr = NSAttributedString(string: "Hello World")

text.appendAttributedString(attr)

这非常符合@ mrtn.lxo解决方案的精神,仅针对NSScrollView并使用NSAttributedString。

答案 6 :(得分:1)

以下是如何使用自动布局以编程方式执行此操作:

class ViewController: NSViewController {
    let scrollView = NSScrollView()
    let textView = NSTextView()

    override func viewDidLoad() {
        super.viewDidLoad()

        textView.maxSize = NSSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude)
        textView.autoresizingMask = .width
        textView.isVerticallyResizable = true
        textView.textContainer?.widthTracksTextView = true

        view.addSubview(scrollView)
        scrollView.translatesAutoresizingMaskIntoConstraints = false
        scrollView.documentView = textView

        NSLayoutConstraint.activate([
            scrollView.topAnchor.constraint(equalTo: view.topAnchor),
            scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor)
        ])
    }
}