【问题标题】:How to create a multiline TextField in SwiftUi ? like the notes app?如何在 SwiftUi 中创建多行文本字段?喜欢笔记应用程序?
【发布时间】:2019-08-27 17:55:39
【问题描述】:

我想创建一个多行文本字段,自动显示换行符和滚动视图,就像笔记应用程序一样,有什么直接的方法可以在 SwiftUI 中做到这一点?

【问题讨论】:

  • 我很确定 Notes 应用程序使用了表格视图,但我们不能完全确定,因为 Notes 应用程序是闭源的。您可以有一个表格视图,其中包含完全是文本字段的自定义单元格,并根据用户选择的字体大小更改单元格的高度。除了 AFAIK 之外,这是迄今为止最好的现有方法。

标签: swift swiftui


【解决方案1】:

这适用于 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()
    }
}

【讨论】:

    【解决方案2】:

    你可以使用

    TextEditor(text: $text)
    

    【讨论】:

      【解决方案3】:

      您要查找的内容本质上是UITextView。 SwiftUI 中没有当前的等效项,因此您必须使用 UIViewRepresentable 结构来实现这一点。请参阅 Apple's SwiftUI + UIKit tutorial 了解如何包装 UIKit 视图和视图控制器以在 SwiftUI 中使用,并参阅 this question 了解可能的实现(以及易于忽略的细节的解决方案。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-24
        • 1970-01-01
        • 2011-03-16
        • 2015-09-28
        • 2015-08-21
        • 1970-01-01
        • 2018-07-14
        • 1970-01-01
        相关资源
        最近更新 更多