SwiftUI - 展开 TextField 以填充 View

标签 swiftui

我正在尝试创建一个横跨整个窗口的 TextField。目前它只会扩展以填充水平轴上的 View 。我的目标是实现与在 TextEdit 中看到的类似的东西。

到目前为止,这是我的代码:

struct ContentView: View {
    @State var contents: String = "Hello World\nThis is a test.";

    var body: some View {
        VStack() {
            TextField("Notes", text: $contents)
                .lineLimit(nil)
        }
        .frame(height: 600)
    }
}

Application Screenshot

这在 SwiftUI 中可行吗?还是我需要恢复使用旧版 AppKit 组件?

最佳答案

我发现包装 NSTextView 仍然是实现类似于在 TextEdit 中看到的效果的最佳方式。所以是的,至少现在您必须在 SwiftUI 代码中使用遗留的 AppKit 组件。

struct MultilineTextView: NSViewRepresentable {
    typealias NSViewType = NSTextView

    @Binding var text: String

    func makeNSView(context: Self.Context) -> Self.NSViewType{
        let view = NSTextView()
        view.isEditable = true
        view.isRulerVisible = true
        return view
    }

    func updateNSView(_ nsView: Self.NSViewType, context: Self.Context) {
        nsView.string = text
    }
}


struct ContentView: View {
    @State var contents: String = "Hello World\nThis is a test.";

    var body: some View {
        VStack() {
            MultilineTextView(text: $contents)
        }.background(Color.white)
    }
}

关于SwiftUI - 展开 TextField 以填充 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58654914/

相关文章:

animation - SwiftUI:NavigationView中的显式动画损坏了吗?

Swift 编译器错误 : "Type ' Watermark' does not conform to protocol 'ViewModifier' "

swift - 为什么我在 Xcode 11 Beta 5 中使用 ForEach 时会出错?

ios - SwiftUI 中的 widgetURL

SwiftUI 将两个 subview 传递给 View

swift - subview 不触发父 View SwiftUI中的禁用状态更新

list - 如何为 SwiftUI 列表中的单个行设置动画?

swift - macOS SwiftUI : how to trigger deleting an item?

swift - 如何在 SwiftUI 中为 Start->Max->Start 设置动画?

ios - 使用组合在一天中的特定时间运行代码