如何在 SwiftUI 中声明“全局@State变量”?

2024-06-24

我是 SwiftUI 新手,目前正在构建我的第一个应用程序。但是,我有一个问题。

我正在编写一个多视图应用程序,在其中我想使用某种全局变量以便能够从我的所有视图访问和编辑它们。 例如,我在应用启动时询问用户的“性别”、“体重”和“许可证”。但是,我也希望他能够在“设置”类别中更改他的详细信息(作为不同的视图)。同时,我想在两个视图中使用相同的变量,并使它们在两个视图中更新。就像基本的全局变量一样。 有办法这样做吗?

我看过一个关于 @State、@ObservableObject 和 @EnvironmentObject 的过时视频。剧透警告:我没听懂。 我希望你能帮助我。如果您需要任何详细信息,请随时:) 山姆


我会推荐什么:ObservableObject called UserSettings。然后,您可以从应用程序场景或 @main 所在的位置将其注入到整个应用程序中.environmentObject(UserSettings(...)).

对于需要访问实例的视图UserSettings,您将执行以下操作:

@EnvironmentObject private var userSettings: UserSettings

Example

环境对象:

class UserSettings: ObservableObject {
    enum Sex: String {
        case male
        case female
        case other
    }

    @Published var sex: Sex
    @Published var weight: Double
    @Published var license: Bool

    init(sex: Sex, weight: Double, license: Bool) {
        self.sex = sex
        self.weight = weight
        self.license = license
    }
}
@main
struct WhateverThisIsApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(UserSettings(sex: .male, weight: 100, license: true))
        }
    }
}

Views:

struct ContentView: View {
    @EnvironmentObject private var userSettings: UserSettings

    var body: some View {
        VStack {
            Text("Current settings:")

            Text("Sex: \(userSettings.sex.rawValue)")

            Text("Weight: \(userSettings.weight)")

            Text("License: \(userSettings.license ? "yes" : "no")")

            SomeChildView()
        }
    }
}
struct SomeChildView: View {
    @EnvironmentObject private var userSettings: UserSettings

    var body: some View {
        Picker("Sex", selection: $userSettings.sex) {
            Text("Male").tag(UserSettings.Sex.male)
            Text("Female").tag(UserSettings.Sex.female)
            Text("Other").tag(UserSettings.Sex.other)
        }
        .pickerStyle(.segmented)
    }
}

Result:


有关使用环境对象的完整演示,请参阅我的答案here https://stackoverflow.com/a/59919052/9607863以及相关的存储库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 SwiftUI 中声明“全局@State变量”? 的相关文章

随机推荐

  • 从 `.` `data.table` 导入,以便 lintr 识别它

    跑步时lintr https github com jimhester lintr在 R 函数上使用data table我收到以下警告 warning no visible global function definition for Di
  • 带有 dcast data.table 的宽格式[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想转换这样的表 set seed 1 mydata lt data frame ID rep 1 4 each 3 R rep
  • 将 IIFE 的公共成员分配给变量与返回对象有什么区别

    我最近查看了大量 JavaScript 代码 并且看到了使用分配 IIFE 的 公共 属性的两种不同方法 第一个是创建一个变量并将该变量分配给 IIFE 内部的属性 如下所示 var public1 function var foo Foo
  • 在 Microsoft Graph 中查找 Azure AD 架构扩展 AppId

    如果通过 Azure AD Connect 同步自定义属性 则会对 Azure AD 进行架构扩展 并且在 Azure AD 中创建一个关联的应用程序 其中包含DisplayName 租户架构扩展应用程序 不幸的是 这些扩展名都是唯一的 并
  • 使用 R 将逗号分隔的列表值转换为稀疏矩阵

    在新的数据结构中 每个segmentId应该变成一个列名 每个 personId 仍应有一行 id SegmentId 单元格是分段 ID 在逗号分隔列表中出现的次数的计数 下面的例子 按原样 我正在尝试以这种形式转换数据 PersonID
  • Android - 通过更新进度栏下载文件

    我的 Dropbox 帐户中有多个文件 我成功下载文件 但我想显示带有百分比的进度条 以便在下载所有文件时 进度条完成 我正在使用 AsyncTask 下载文件 这是我的代码 public void onPreExecute mDialog
  • 数据结构格式(YAML 或其他)的往返解析保留注释,用于编写配置

    我一直在多个应用程序中使用 YAML 作为配置文件格式 一切都很顺利 除了一件事 当我的程序需要在 YAML 配置文件中写入 修改配置变量时 它会通过加载和转储整个文件来破坏格式和注释 结构 嗯 实际上 YAML 还有另一个问题 大多数用户
  • 在 C# 中设置树节点的父节点的正确方法?

    我正在研究一棵定制树 每个节点 BindingNode 是我对它们的称呼 都包含一个 BindingNodeCollection 它实现收藏 http msdn microsoft com en us library 92t2ye13 as
  • Android sqlite 日志报告和 db.close()

    日志报告数据库或游标未关闭 我基本上有一个带有自定义表面视图的活动 并使用处理程序向活动报告 当我收到消息时 我会显示一个警报对话框并更新数据库 private Handler handler new Handler public void
  • QImage 转换为 QML

    我的应用程序通过网络接收 JPEG 实时流 每秒 16 帧 直播流应使用 QML 显示 接收部分是用C 编写的 所有UI都是用QML编写的 如何将图像数据输入 QML 窗口 我已经研究过如何显示 QImage 但还没有找到解决方案 实现 Q
  • 当恰好有一个选项非空时执行某项操作

    如果两个选项之一非空 我想计算一些东西 显然这可以通过模式匹配来完成 但是有更好的方法吗 o1 o2 match case Some o None gt Some compute o case None Some o gt Some com
  • project.parent.name 和parent.name 之间的区别以及在pom.xml 中使用finalName

    对线程的研究具有显式 FinalName 的 Maven 将无法正常工作 https stackoverflow com questions 40336878 maven with an explicit finalname wont wo
  • ASP.NET锁定线程的方法

    我正在使用 C 开发 ASP NET 表单 Web 应用程序 我有一种为客户创建新订单的方法 它看起来与此类似 private string CreateOrder string userName Fetch current order O
  • C++ for 循环和基于范围的循环性能

    我读到基于范围的循环在某些编程语言上具有更好的性能 C 中也是这样吗 例如 int main vector
  • 将 RenderTargetBitmap 转换为 System.Drawing.Image

    我有 3D WPF 视觉对象 我想将其传递到 Excel 单元格 通过剪贴板缓冲区 对于 普通 BMP 图像 它可以工作 但我不知道如何转换RenderTargetBitmap 我的代码如下所示 System Windows Media I
  • 如何在 C# 中检查对象是否可序列化

    我正在寻找一种简单的方法来检查 C 中的对象是否可序列化 正如我们所知 您可以通过实现以下方式使对象可序列化可序列化接口或通过放置 可序列化 在班级中名列前茅 我正在寻找一种快速的方法来检查这一点 而不必反映该类来获取其属性 使用界面会很快
  • 此代码中 Matlab 与 C++ 速度比较

    我编写了简单的 C 代码并在 C 中对其进行了测试 然后我通过以下方式为 MATLAB 调整了相同的代码mex file name cpp并在 MATLAB 中运行相同的代码 该代码使用与 C 相同的编译器 这是代码 int k for i
  • 如何为 java 调用者声明返回类型为“void”的 Kotlin 函数?

    我有一个完全用 Kotlin 编写的库 包括其公共 API 现在该库的用户使用 Java 这里的问题是 Kotlin 函数具有返回类型Unit未编译为返回类型void 结果是 Java 端必须始终为实际上无效的方法返回 Unit INSTA
  • 用于存储键值映射的最佳 PostgreSQL 数据类型?

    我想将一个简单的键值字符串映射存储为 PostgreSQL 表中的字段 我打算将地图视为一个整体 即 始终选择整个地图 并且永远不要通过其键或值进行查询 我读过文章比较hstore json and jsonb 但这些并不能帮助我选择哪种数
  • 如何在 SwiftUI 中声明“全局@State变量”?

    我是 SwiftUI 新手 目前正在构建我的第一个应用程序 但是 我有一个问题 我正在编写一个多视图应用程序 在其中我想使用某种全局变量以便能够从我的所有视图访问和编辑它们 例如 我在应用启动时询问用户的 性别 体重 和 许可证 但是 我也