在 SwiftUI 中设置 TextField 的初始值 - 比较新旧值

2023-11-25

我看过很多有关如何使用空 TextField 来收集新值的示例和教程,但没有一个展示如何使用 TextField 来编辑值。

在我的用例中,我希望用视图模型中的数据预填充/预填充 TextField,然后当用户编辑数据时,应启用“保存”按钮。在我的表单中,我还有一个导航链接,该链接指向一个子页面,用户可以在其中从列表中选择某些内容,然后路由回表单。

只要我使用空字段,它的行为就如所描述的那样;用户可以在字段中输入临时内容,导航到子页面,临时值仍然像他离开时一样。

struct TextFieldDemo: View {

    var model:String    // Actual a more complex view model
    @State var editedValue:String = ""

    var body: some View {
        VStack(alignment: .leading, spacing: 20) {
            Group{
                Text("Some label")
                TextField("Placeholder text", text: $editedValue)
            }
            Divider()
            Text("Some navigation link to push in a page where " +
                "the user can select something from a list and click back...")

            // If the user starts to edit the textfield - follows a navigation link and comes back
            // he should be able to continue edit the field where he left of - the text field should
            // not have been reset to the original value.

            Button(action: {
                // Call some save function in the ViewModel
                },label: {
                    Text("SAVE")
                }
            ).disabled(model == editedValue)
        }.onAppear(){
            // I could have done something like:
            //   self.editedValue = model
            // but it seems like this will fire if the user navigates into the described page and reset
            // the TextField to the model value.
        }
    }
}

struct TextFieldDemo_Previews: PreviewProvider {
    static var previews: some View {
        TextFieldDemo(model: "The old value")
    }
}

要使用模型中的值初始化文本字段,您需要定义自己的初始值设定项并使用State(wrappedValue:)初始化程序@State vars:

struct TextFieldDemo: View {

    var model:String    // Actual a more complex view model
    @State var editedValue: String

    init(model: String) {
        self.model = model
        self._editedValue = State(wrappedValue: model) // _editedValue is State<String>
    }

    var body: some View {
        VStack(alignment: .leading, spacing: 20) {
            Group{
                Text("Some label")
                TextField("Placeholder text", text: $editedValue)
            }
            Divider()
            Text("Some navigation link to push in a page where " +
                "the user can select something from a list and click back...")

            // If the user starts to edit the textfield - follows a navigation link and comes back
            // he should be able to continue edit the field where he left of - the text field should
            // not have been reset to the original value.

            Button(action: {
                // Call some save function in the ViewModel
                },label: {
                    Text("SAVE")
                }
            ).disabled(model == editedValue)
        }.onAppear(){
            // I could have done something like:
            //   self.editedValue = model
            // but it seems like this will fire if the user navigates into the described page and reset
            // the TextField to the model value.
        }
    }
}

struct TextFieldDemo_Previews: PreviewProvider {
    static var previews: some View {
        TextFieldDemo(model: "The old value")
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 SwiftUI 中设置 TextField 的初始值 - 比较新旧值 的相关文章

随机推荐

  • 如何删除名称以“-”开头的文件[重复]

    这个问题在这里已经有答案了 在脚本中出现错误后 我最终得到了一个名称以破折号开头的文件 myfile txt 到目前为止我尝试过 rm myfile txt rm illegal option m usage rm f i dPRrvW f
  • 使用 this-> 访问成员是否有任何开销?

    当访问某个类的成员时 我可以使用例如 this gt myVar 10 或者我可以写 myVar 10 我喜欢用this gt 因为它显式声明该变量是此类的成员 但是与仅使用变量名本身相比 它是否会导致任何开销 作为替代方案 我可以向变量添
  • 从 data.frame 或 data.table 构建方形邻接矩阵

    我正在尝试建立一个方形邻接matrix from a data table 这是我已经拥有的可重现的示例 require data table require plyr require reshape2 Build a mock data
  • Locale.ITALY 和 Locale.ITALIAN 有什么不同

    和有什么区别Locale国家和语言 例如Locale ITALY and Locale ITALIAN 我在哪里可以找到其他语言环境的所有这些差异 我应该什么时候使用每一个 是否可以开发我们所需的语言环境 如何 Locale ITALIAN
  • Laravel 4 Illuminate \ Database \ Eloquent \ MassAssignmentException 错误

    嘿 我已经在那里搜索了很多答案 但无法解决这个问题 这是我的迁移代码
  • 在 ASP.NET c# 中查找日期 10 月的最后一个星期日

    嗨 有没有办法找出 ASP NET C 中十月最后一个星期日的日期 我正在使用 net 2 0 不需要为此运行循环 private static DateTime GetLastWeekdayOfMonth DateTime date Da
  • 在 .NET 中创建和部署 ActiveX 控件

    由于显然没有可以接受位图粘贴的 Flash 控件 我想考虑自己写一个 但我不想使用 Flash 所以我考虑使用 NET 现在我相信可以在浏览器中下载并运行的本机代码控件的正确术语是 ActiveX 控件 所以我的问题是 我可以用 NET 创
  • FBSDK 空登录视图

    自从升级到最新的 Xcode 后 我在尝试通过 FBSDK 登录时遇到了一些问题FBSDKLoginManager Safari 中的登录窗口会弹出 但它保持白色 空视图 没有导航项或内容 控制台返回以下内容 ViewService 无法获
  • 将分组 zscore 列添加到 pandas 数据框中

    我可以将一列插入到数据框中 对另一列进行 z 评分 如下所示 1 df insert
  • Rails:从控制器调用另一个控制器操作

    我需要从控制器 B 调用控制器 A 中的创建操作 原因是当我从控制器 B 调用时 我需要以不同的方式重定向 可以在 Rails 中完成吗 要使用另一个控制器 请执行以下操作 def action that calls one from an
  • 点击按钮时忽略 UIGestureRecognizer

    我设置了一个手势识别器 以便在点击屏幕时我的工具栏会向下滑动 当我点击栏上的按钮时 即算作一次点击 在这些情况下如何取消手势 Thanks 您可以查看 Simple GestureRecognizers 示例项目 http develope
  • 两个字符串之间的所有公共子字符串

    我正在使用 C 来查找两个字符串之间的所有公共子字符串 例如 如果输入是 S1 需要电子邮件方面的帮助 S2 需要电子邮件帮助 输出应该是 需要帮助电子邮件 下面的代码返回最长的公共子字符串 但我希望我的代码返回所有公共子字符串 任何帮助深
  • 像 Whatsapp 一样快速视频压缩

    我需要加快 Android 应用程序中的视频压缩速度 我使用的是 FFMPEG 压缩 80MB 视频需要 3 分钟 有谁知道更好的解决方案 我正在使用的命令是 data data com moymer app bin ffmpeg y i
  • 旋转图像并裁剪掉黑色边框

    我的应用程序 我正在尝试旋转图像 使用 OpenCV 和 Python 目前我已经开发了下面的代码 它旋转输入图像 用黑色边框填充它 给我 A 我想要的是 B 旋转图像内最大可能的区域裁剪窗口 我将其称为轴对齐的有界框 这本质上是相同的旋转
  • 如何在Excel中提取最后一个下划线之后的字符串的最后一部分

    我有以下示例数据 1 animated brand 300x250 2 animated brand 300x600 3 customaffin greenliving solarhome anim outage offer 如何在 Mic
  • 在.NET API中添加对PresentationCore.dll和PresentationFramework.dll的引用

    我试图在 NET 5 API 中引用PresentationCore dll 和PresentationFramework dll 但显然它还需要WindowsBase 这是我得到的错误 System TypeLoadException 无
  • 使用 data: URI 时有没有办法指定建议的文件名?

    例如 如果您点击链接 data application octet stream base64 SGVsbG8 浏览器将提示您下载一个文件 该文件包含超链接本身中以 Base64 形式保存的数据 有什么方法可以在标记中建议默认名称吗 如果没
  • 解析 - 使用关系与指针?

    我使用 Parse 作为我的后端 我在设置对象之间的正确关系时遇到问题 我基本上有一个名为 Post 的类 每个帖子都属于一个用户 PFUser 当获取帖子时 我希望用户信息与帖子一起获取 interface Post PFObject
  • gRPC Java 文件下载示例

    我正在寻找一种如何使用 gRPC 实现文件下载功能的方法 但我在文档中找不到这是如何完成的 做到这一点的最佳方法是什么 我想要一个保存文件的 gRPC 服务器和一个向 gRPC 请求某些内容的 gRPC 客户端 我已经查看了 Java 中的
  • 在 SwiftUI 中设置 TextField 的初始值 - 比较新旧值

    我看过很多有关如何使用空 TextField 来收集新值的示例和教程 但没有一个展示如何使用 TextField 来编辑值 在我的用例中 我希望用视图模型中的数据预填充 预填充 TextField 然后当用户编辑数据时 应启用 保存 按钮