当前位置: 首页 > 知识库问答 >
问题:

如何在SwiftUI for MacOS中创建多行文本字段?

高正初
2023-03-14

我正在用Swift编写我的第一个MacOS应用程序。我需要创建一个简单的可编辑文本框,允许多个段落。在HTML中,这将是一个文本区域

我推测iOS14将包含TextEditor,但现在还没有,我不知道MacOS中是否会有。

我看到的许多解决方案都假定使用iOS和UIKit。

如何使用SwiftUI和MacOS执行此操作?

更新

有人建议这个问题与此类似:如何在SwiftUI中创建多行TextField?

我已经看了这个问题,但是:

  • 链接的问题是专门针对iOS的,但我的问题是针对MacOS的
  • 据我所知,答案是专门针对使用UIKit的iOS的。如果有人愿意解释这是如何回答我的MacOS问题的,我会很感兴趣

共有1个答案

臧兴学
2023-03-14

以下是iOS14文本编辑器等组件的一些初始演示。

准备演示

struct TestTextArea: View {
    @State private var text = "Placeholder: Enter some text"

    var body: some View {
        VStack {
            TextArea(text: $text)
                .border(Color.black)
//            Text(text) // uncomment to see mirror of enterred text
        }.padding()
    }
}

struct TextArea: NSViewRepresentable {
    @Binding var text: String

    func makeNSView(context: Context) -> NSScrollView {
        context.coordinator.createTextViewStack()
    }

    func updateNSView(_ nsView: NSScrollView, context: Context) {
        if let textArea = nsView.documentView as? NSTextView, textArea.string != self.text {
            textArea.string = self.text
        }
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(text: $text)
    }

    class Coordinator: NSObject, NSTextViewDelegate {
        var text: Binding<String>

        init(text: Binding<String>) {
            self.text = text
        }

        func textView(_ textView: NSTextView, shouldChangeTextIn range: NSRange, replacementString text: String?) -> Bool {
            defer {
                self.text.wrappedValue = (textView.string as NSString).replacingCharacters(in: range, with: text!)
            }
            return true
        }

        fileprivate lazy var textStorage = NSTextStorage()
        fileprivate lazy var layoutManager = NSLayoutManager()
        fileprivate lazy var textContainer = NSTextContainer()
        fileprivate lazy var textView: NSTextView = NSTextView(frame: CGRect(), textContainer: textContainer)
        fileprivate lazy var scrollview = NSScrollView()

        func createTextViewStack() -> NSScrollView {
            let contentSize = scrollview.contentSize

            textContainer.containerSize = CGSize(width: contentSize.width, height: CGFloat.greatestFiniteMagnitude)
            textContainer.widthTracksTextView = true

            textView.minSize = CGSize(width: 0, height: 0)
            textView.maxSize = CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude)
            textView.isVerticallyResizable = true
            textView.frame = CGRect(x: 0, y: 0, width: contentSize.width, height: contentSize.height)
            textView.autoresizingMask = [.width]
            textView.delegate = self

            scrollview.borderType = .noBorder
            scrollview.hasVerticalScroller = true
            scrollview.documentView = textView

            textStorage.addLayoutManager(layoutManager)
            layoutManager.addTextContainer(textContainer)

            return scrollview
        }
    }
}
 类似资料:
  • 问题内容: 由于目前无法配置为删除行分隔符,因此我在其内部使用来创建文本元素的垂直布局。下面的例子: 生成的结果被截断为单行。在a之外,它呈现为多行。除了明确设置框架的高度之外,如何在其他内部实现呢? 问题答案: 在 Xcode 11 GM中 : 对于嵌套在滚动视图中的堆栈中的任何视图,请使用解决方法: 如果有多个多行文字,这也适用: 如果堆栈的内容是动态的,则可以使用相同的解决方案:

  • 问题内容: 我有一个包含数千行的生成的文件,如下所示: 有些行的字段更多,而其他行的字段较少,但是所有行都遵循相同的键值对模式,每行都有一个TSN字段。 在对文件进行一些分析时,我编写了如下所示的循环,以将文件读入字典: …这很好,并且确实满足我的要求(这只是一个简单的示例)。 但是,对于我和以下内容而言,它并不是特别“ pythonic”: 哪个感觉“笨拙”(在字段上迭代了多少次?)。 仅使用标

  • 了解有关在 Adobe Illustrator 中创建和使用文字的信息... 在点处输入文本 点文字是指从单击位置开始并随着字符输入而扩展的一行或一列横排或直排文本。每行文本都是独立的;对其进行编辑时,该行将扩展或缩短,但不会换行。这种方式非常适用于在图稿中输入少量文本的情形。 选择文字工具 或直排文字工具 。 鼠标指针会变成一个四周围绕着虚线框的文字插入指针。靠近这个文字插入指针底部的短水平线,

  • 本文向大家介绍如何在Python中创建长的多行字符串?,包括了如何在Python中创建长的多行字符串?的使用技巧和注意事项,需要的朋友参考一下 为了创建多行字符串,我们使用三对来代替使用一对单引号/双引号。例如,  这将给出输出:  请注意,您不能使用此符号插入字符串。此符号也用于在Python中定义文档字符串。

  • 问题内容: 我在Ruby中有以下代码。我想将此代码转换为JavaScript。JS中的等效代码是什么? 问题答案: 更新: ECMAScript 6(ES6)引入了一种新型的文字,即 模板文字 。它们具有许多功能,其中包括变量插值,但对于这个问题最重要的是,它们可以是多行的。 模板文字由 反引号 分隔: (注意:我不主张在字符串中使用HTML) 浏览器支持还可以,但是您可以使用编译器来更好地兼容。

  • 路径文字是指沿着开放或封闭的路径排列的文字。当您水平输入文本时,字符的排列会与基线平行。当您垂直输入文本时,字符的排列会与基线垂直。无论是哪种情况,文本都会沿路径点添加到路径上的方向来排列。 在路径上输入文本 执行下列操作之一: 要沿路径创建横排文本,请选择文字工具 或路径文字工具 。 要沿路径创建直排文本,请选择直排文字工具 或直排路径文字工具 。 (可选)在“控制”面板、“字符”面板或“段落”