SwiftUI中TextField和TextEditor的使用

在SwiftUI中,TextField是用于接收用户输入的文本框组件。它允许用户在应用程序中输入文本,并可以与其他视图和数据进行交互。TextField提供了丰富的样式和功能,使得用户输入变得简单而灵活。TextEditor是一个多行文本输入控件,当你希望用户输入多行文本时,可以使用它。

TextField的使用

TextField通常需要一个类似于提示的占位符文本,以及一个接受用户输入的状态变量(通常是一个被@State修饰的String类型的值)。
比如下面这段简单的代码,设置了默认的缺省提示文字username,并且绑定了username这个属性,用于记录用户输入的内容。

struct TextFieldDemo: View {
  @State var username: String = ""

  var body: some View {
    NavigationView {
      VStack {
        TextField("username", text: $username)
          .padding()

        Spacer()
      }
    }
  }
}

TextField样式

SwiftUI中的TextField样式(textFieldStyle)主要有以下几种:

  1. PlainTextFieldStyle:简单的文本框样式,没有背景或边框。
    示例代码:.textFieldStyle(PlainTextFieldStyle())
  2. RoundedBorderTextFieldStyle:带有圆角边框的文本框样式。
    示例代码:.textFieldStyle(RoundedBorderTextFieldStyle())
  3. DefaultTextFieldStyle:默认的文本框样式,根据系统和环境自动选择合适的样式。
    示例代码:.textFieldStyle(DefaultTextFieldStyle())
    在这里插入图片描述

通过这种简单的设置,估计很难满足设计的要求,所以还要结合其他修饰符的使用,比如背景色,前景色,圆角,边框等等。

关于颜色特别说明一下:
.foregroundColor():设置输入的文字的颜色。
.background():整个输入框的背景颜色。
.colorMultiply():输入框内部输入部分的颜色。

colorMultiply()SwiftUI中的一个修饰符,用于修改视图的颜色。具体来说,colorMultiply()会将视图的颜色与指定的颜色进行混合,从而改变视图的整体颜色效果。

struct ContentView: View {
    var body: some View {
        Text("Hello, SwiftUI!")
            .foregroundColor(.yellow)
            .colorMultiply(.red)
    }
}

比如上面这个代码,文字的颜色就会变为偏橘黄色。

TextField中,虽然设置.colorMultiply()能改变输入框内部的颜色,但是会和设置的.foregroundColor()混合,不能达到我们想要的效果。比如下面代码和效果图。
在这里插入图片描述
混合后文字的颜色不是红色的。所以在用.colorMultiply()的时候还是要小心。

修改缺省提示文字的样式:
在创建TextField的时候,选择带prompt参数的初始化方法,如下:

TextField("username",
      text: $username,
      prompt: Text("enter your username")
          .foregroundColor(.red)
          .font(.subheadline)
          .fontWeight(.bold)
        )

其中prompt参数设置了一个Text组件,并且设置了颜色,字体等信息,这个prompt就是设置缺省文字。

TextField修饰符

TextField("enter username", text: $username)
  .textFieldStyle(RoundedBorderTextFieldStyle())
  .textContentType(.telephoneNumber)
  .keyboardType(.numberPad)
  .autocorrectionDisabled()

.textContentType()文字内容修饰符是设置我们希望文本框输入的内容类型,如emailAddress邮箱地址、URL链接地址或者telephoneNumber电话号码等.

.keyboardType()键盘类型修饰符,是当我们在真机或者模拟器中使用点击文本框时,设置唤起的键盘的类型。这里我们假设这是一个输入电话号码的文本框,我们希望输入时,iOS 的软键盘就自动切换为数字格式的键盘。

.autocorrectionDisabled()禁用自动纠正修饰符,接收Bool类型的值,当值 true 时,则唤起软键盘的时候就会禁用软键盘在输入时,iOS 自动纠正输入的内容。

SecureField使用

SecureField是用于接收用户输入的安全文本框组件,通常用于输入敏感信息,如密码。
SecureField隐藏用户输入的文本内容,用圆点或其他符号代替,保护用户的隐私和安全。

SecureField("Enter password", text: $password)

onEditingChanged和onCommit

TextField有两个回调方法:

onEditingChanged: @escaping (Bool) -> Void

onEditingChanged: TextField在用户开始编辑文本和完成编辑文本后调用onEditingChanged闭包。闭包接收一个指示编辑状态的布尔值,用户开始编辑时为true,完成编辑时为false

onCommit: @escaping () -> Void = {})

当用户按回车键时,TextField调用onCommit闭包。

具体使用如下代码:

struct TextFieldDemo: View {
  @State var username: String = ""

  var body: some View {
    NavigationView {
      VStack(spacing: 30.0) {

        TextField("username", text: $username, onEditingChanged: { isEditing in
          print("isEditing: \(isEditing)")
        }, onCommit: {
          print("Edit finished")
        })
          .textFieldStyle(RoundedBorderTextFieldStyle())
          .textContentType(.telephoneNumber)
          .keyboardType(.numberPad)
          .autocorrectionDisabled()

        Spacer()
      }
      .padding()
    }
  }
}

TextField Formatter(格式化)

SwiftUI中,可以使用TextField的初始化方法中的formatter参数来设置文本框的格式化器(Formatter)。格式化器用于控制文本框中输入文本的格式,例如限制输入字符、添加特定格式等。以下是关于如何使用formatter参数的说明:

TextField("Enter amount", value: $amount, formatter: NumberFormatter())

前两个参数无需多说,NumberFormatter()是一个NumberFormatter实例,用于格式化文本框中的数值输入,Formatter还有很多种,常见的有NumberFormatter,其他的就看需求了,这里不赘述了。

Formatter作用:

  • 限制输入:Formatter可以限制用户输入的内容,如只允许输入数字。
  • 格式化显示:Formatter可以控制文本框中数值的显示格式,如小数位数、千位分隔符等。
  • 数据转换:Formatter可以将用户输入的文本转换为特定类型的数据,如将文本转换为数值类型。

在这里插入图片描述

TextEditor的使用

SwiftUI中,TextEditor是一个多行文本输入控件,当你希望用户输入多行文本时,可以使用它,例如在笔记应用程序或聊天应用程序中,用户可以输入多行消息。TextEditor组件的行为很像UIKit中的UITextView

创建TextEditor,需要创建一个状态变量来存储用户的输入,然后将该状态绑定到TextEditor。这里有一个例子:
在这里插入图片描述
很多用于TextField的修饰符同样适用于TextEditor

写在最后

本篇文章比较简单,有点杂乱,哈哈,希望能够帮助到有需要的朋友,如果觉得有帮助,还望点个赞,添加个关注,笔者也会不断地努力,写出更多更好用的文章。

### SwiftUI TextField 性能问题及优化方案 在 SwiftUI 中,`TextField` 是一个常用的文本输入组件。然而,在某些情况下可能会遇到性能问题延迟现象。为了改善 `TextField` 的响应速度整体表现,可以从以下几个方面入手: #### 使用合适的修饰符减少重绘次数 频繁触发视图更新会消耗大量资源,导致应用卡顿。通过合理设置状态变量以及采用懒加载方式来降低不必要的刷新频率。 对于简单的单行文字输入场景推荐继续沿用 `TextField` 组件;而对于多行文本编辑需求,则建议考虑使用 `TextEditor` 替代[^1]。因为后者专为处理更复杂的富文本而设计,通常具有更好的渲染效率。 #### 避免过度绑定数据源 当 `TextField` 其他 UI 元素之间存在复杂的数据流关系时,应谨慎管理这些连接以免造成循环依赖或过多的通知事件传播。确保只监听必要的属性变化,并及时中断不再需要的观察者链路。 此外,如果发现每次键盘弹起都会引起整个页面重新布局的情况,那么可能是由于父级容器采用了不恰当的高度计算逻辑所致。此时应当审查相关约束条件并作出相应调整。 #### 应用异步编程模式提升交互流畅度 针对一些耗时较长的操作(比如网络请求),应该将其移至后台线程执行,防止阻塞主线程从而影响用户体验。利用 Swift Concurrency 或 Combine 框架所提供的工具实现高效的任务调度机制。 ```swift import SwiftUI struct ContentView: View { @State private var text = "" var body: some View { VStack { // 使用 TextField 进行简单文本输入 TextField("Enter something...", text: $text) .padding() Button(action: performHeavyTask) { Text("Start Heavy Task") .padding() } } } func performHeavyTask() async { await withCheckedContinuation { continuation in DispatchQueue.global().async { Thread.sleep(forTimeInterval: 2.0) // Simulate heavy task DispatchQueue.main.async { continuation.resume() } } } } } ``` 上述代码展示了如何创建一个不会干扰到 `TextField` 输入体验的同时启动长时间运行工作的按钮点击处理器函数[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值