10

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

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

但这似乎不起作用。感觉很困惑,因为用 a 做同样的事情NSTextView就像一个魅力。

我在这里想念什么?

4

7 回答 7

13

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

如果您的scrollView/textView 为空/空白,或者如果您需要在scrollView/textView 中已有的内容之前附加文本,则以下方法有效。如果框中已有文本,则将新文本插入现有文本的前面。

documentView 是一个 NSTextView

斯威夫特 4.0

@IBOutlet weak var imageDestinationDirectory: NSScrollView!

...

let destinationText = "Text to display"
imageDestinationDirectory.documentView!.insertText(destinationText)
于 2017-11-18T11:49:58.537 回答
6

似乎 Xcode 的早期 beta 版本(以 Swift 为特色)在这种插座方面存在一些严重问题(如您在此处看到的:http: //swiftwtf.tumblr.com/post/88387419568/nstextview)。但是,因为Xcode 6 Beta 6它有效。

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

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

于 2014-08-25T13:57:15.860 回答
5

Apple 有一篇关于以编程方式在滚动视图中设置文本视图的文章。文本系统用户界面层编程指南:将 NSTextView 对象放入 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;
于 2014-08-13T11:09:44.977 回答
3

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

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)
        ])
    }
}
于 2017-07-18T07:20:23.090 回答
3
@IBOutlet weak var scrollView: NSScrollView!

The documentViewof theNSScrollView是一个NSTextView,所以在 Swift 中你可以使用下面的:

let textView : NSTextView? = scrollView?.documentView as? NSTextView
textView?.string = text
于 2020-01-25T22:57:31.640 回答
2

ixany 的答案效果很好,但作为一个初学者,我有更多的时间来弄清楚,应该为 NSTextView 而不是为 NSTextScroll 完成该出口。NSTextView 隐藏在 NSTextScroll 内部。 在我的情况下,所有结果字段都是 NSTextScroll,文本视图结果是 NSTextView

于 2016-10-07T01:36:59.510 回答
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。

于 2015-08-10T18:12:49.700 回答