Как создать многострочное TextField в SwiftUI? - PullRequest
10 голосов
/ 06 июня 2019

Я пытался создать многострочное TextField в SwiftUI, но я не могу понять, как это сделать.

Это код, который у меня сейчас есть:

struct EditorTextView : View {
    @Binding var text: String

    var body: some View {
        TextField($text)
            .lineLimit(4)
            .multilineTextAlignment(.leading)
            .frame(minWidth: 100, maxWidth: 200, minHeight: 100, maxHeight: .infinity, alignment: .topLeading)
    }
}

#if DEBUG
let sampleText = """
Very long line 1
Very long line 2
Very long line 3
Very long line 4
"""

struct EditorTextView_Previews : PreviewProvider {
    static var previews: some View {
        EditorTextView(text: .constant(sampleText))
            .previewLayout(.fixed(width: 200, height: 200))
    }
}
#endif

Но это вывод:

enter image description here

Ответы [ 2 ]

7 голосов
/ 06 июня 2019

С Text() вы можете достичь этого, используя .lineLimit(nil), и документация предполагает, что должно работать и для TextField().Тем не менее, я могу подтвердить, что в настоящее время это работает не так, как ожидалось.

Я подозреваю, что есть ошибка - рекомендую заполнить отчет с помощью Feedback Assistant.Я сделал это, и идентификатор FB6124711.

5 голосов
/ 11 июня 2019

Обновление: хотя Xcode11 beta 4 теперь поддерживает TextView, я обнаружил, что перенос UITextView по-прежнему является лучшим способом заставить работать редактируемый многострочный текст.Например, TextView имеет проблемы с отображением, когда текст не отображается должным образом внутри представления.

Оригинальный (бета 1) ответ:

На данный момент вы можете заключить UITextView для созданиясоставное View:

import SwiftUI
import Combine

final class UserData: BindableObject  {
    let didChange = PassthroughSubject<UserData, Never>()

    var text = "" {
        didSet {
            didChange.send(self)
        }
    }

    init(text: String) {
        self.text = text
    }
}

struct MultilineTextView: UIViewRepresentable {
    @Binding var text: String

    func makeUIView(context: Context) -> UITextView {
        let view = UITextView()
        view.isScrollEnabled = true
        view.isEditable = true
        view.isUserInteractionEnabled = true
        return view
    }

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

struct ContentView : View {
    @State private var selection = 0
    @EnvironmentObject var userData: UserData

    var body: some View {
        TabbedView(selection: $selection){
            MultilineTextView(text: $userData.text)
                .tabItemLabel(Image("first"))
                .tag(0)
            Text("Second View")
                .font(.title)
                .tabItemLabel(Image("second"))
                .tag(1)
        }
    }
}

#if DEBUG
struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        ContentView()
            .environmentObject(UserData(
                text: """
                        Some longer text here
                        that spans a few lines
                        and runs on.
                        """
            ))

    }
}
#endif

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...