返回

用 SwiftUI 创建真正的可编辑文本框

IOS

在 SwiftUI 中,@State 属性包装器让我们可以自由地修改视图结构体,这意味着当程序状态改变时,我们可以更新属性值来匹配状态。但是,事情对于 UI 控件会稍微复杂一些。

举个例子,如果创建了一个可编辑文本框,用户可以输入文本,就像这样:

struct ContentView: View {
    @State private var text = ""
    
    var body: some View {
        TextField("Enter some text", text: $text)
    }
}

上面的代码创建了一个包含一个文本框和一个按钮的视图。当用户在文本框中输入文本时,text 属性将更新,按钮上的文本也会随之更新。

但是,如果你想创建一个真正的可编辑文本框,用户可以在其中输入多行文本,事情就会变得更加复杂。这就是 TextField 视图的局限所在。

为了创建一个真正的可编辑文本框,我们需要使用 TextEditingView 视图。TextEditingView 视图是一个容器视图,它允许我们在其中放置任何可以编辑文本的视图。

例如,我们可以创建一个包含一个文本框和一个按钮的视图,就像这样:

struct ContentView: View {
    @State private var text = ""
    
    var body: some View {
        TextEditingView(text: $text) {
            TextEditor()
        }
        
        Button("Save") {
            // 保存文本
        }
    }
}

上面的代码创建了一个包含一个文本框和一个按钮的视图。当用户在文本框中输入文本时,text 属性将更新,按钮上的文本也会随之更新。

但是,TextEditingView 视图有一个缺点,那就是它不能直接与 @State 属性一起使用。为了解决这个问题,我们需要使用 @Binding 属性包装器。

@Binding 属性包装器允许我们在视图和模型之间创建双向绑定。这意味着当视图中的属性值改变时,模型中的属性值也会改变,反之亦然。

例如,我们可以创建一个包含一个文本框和一个按钮的视图,就像这样:

struct ContentView: View {
    @State private var text = ""
    
    var body: some View {
        TextEditingView(text: $text) {
            TextEditor()
        }
        
        Button("Save") {
            // 保存文本
        }
    }
}

上面的代码创建了一个包含一个文本框和一个按钮的视图。当用户在文本框中输入文本时,text 属性将更新,按钮上的文本也会随之更新。

现在,我们已经创建了一个真正的可编辑文本框。我们可以使用它来创建各种各样的应用程序,比如日记应用程序、记事本应用程序,甚至是一个简单的文本编辑器。