如何在SwiftUI中创建多行文本框?类似于“笔记”应用程序。

6
我想创建一个多行文本框,自动添加换行符并带有滚动视图,就像笔记应用程序一样,在SwiftUI中是否有直接的方法可以实现这一点?

我相信笔记应用程序使用了表视图,尽管我们不能完全确定,因为笔记应用程序是闭源的。您可以使用自定义单元格的表视图,这些单元格完全是文本字段,并根据用户选择的字体大小更改单元格的高度。除此之外,据我所知,这是目前最好的方法。 - Mike
另请参阅 https://dev59.com/ILfna4cB1Zd3GeqPmBbs - DogCoffee
3个回答

10

这在Xcode 11.0 beta 6版本中有效:

import SwiftUI

struct ContentView: View {
     @State var text = ""

       var body: some View {
        VStack {
            Text("text is: \(text)")
            TextView(
                text: $text
            )
                .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
        }

       }
}

struct TextView: UIViewRepresentable {
    @Binding var text: String

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIView(context: Context) -> UITextView {

        let myTextView = UITextView()
        myTextView.delegate = context.coordinator

        myTextView.font = UIFont(name: "HelveticaNeue", size: 15)
        myTextView.isScrollEnabled = true
        myTextView.isEditable = true
        myTextView.isUserInteractionEnabled = true
        myTextView.backgroundColor = UIColor(white: 0.0, alpha: 0.05)

        return myTextView
    }

    func updateUIView(_ uiView: UITextView, context: Context) {
        uiView.text = text
    }

    class Coordinator : NSObject, UITextViewDelegate {

        var parent: TextView

        init(_ uiTextView: TextView) {
            self.parent = uiTextView
        }

        func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
            return true
        }

        func textViewDidChange(_ textView: UITextView) {
            print("text now: \(String(describing: textView.text!))")
            self.parent.text = textView.text
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

4

您可以使用

TextEditor(text: $text)

2
你要找的基本上是一个UITextView。目前在SwiftUI中没有相应的控件,因此您需要使用UIViewRepresentable结构体来实现。请参阅Apple的SwiftUI + UIKit教程,了解如何将UIKit视图和视图控制器包装以供SwiftUI使用,并参见this question,了解可能的实现方式(以及易于忽略细节的解决方案)。

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