首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SwiftUI:如何从一个视图传递数据并在另一个视图的viewModel中使用

SwiftUI是一种用于构建iOS、macOS、watchOS和tvOS应用程序的用户界面工具包。它是苹果公司在2019年推出的一项全新的UI框架,旨在简化和改进应用程序的开发过程。

在SwiftUI中,可以使用属性包装器和环境对象来实现视图之间的数据传递。以下是一种常见的方法,用于从一个视图传递数据并在另一个视图的viewModel中使用:

  1. 创建一个ObservableObject类,作为数据模型的容器。这个类应该遵循ObservableObject协议,并使用@Published属性包装器来标记需要在视图之间共享的属性。
代码语言:txt
复制
import SwiftUI
import Combine

class ViewModel: ObservableObject {
    @Published var data: String = ""
}
  1. 在发送数据的视图中,将ViewModel实例注入到环境中,并使用@EnvironmentObject属性包装器来访问ViewModel实例。
代码语言:txt
复制
import SwiftUI

struct SendingView: View {
    @EnvironmentObject var viewModel: ViewModel
    
    var body: some View {
        VStack {
            TextField("Enter data", text: $viewModel.data)
            NavigationLink(destination: ReceivingView()) {
                Text("Send")
            }
        }
    }
}
  1. 在接收数据的视图中,同样需要将ViewModel实例注入到环境中,并使用@EnvironmentObject属性包装器来访问ViewModel实例。
代码语言:txt
复制
import SwiftUI

struct ReceivingView: View {
    @EnvironmentObject var viewModel: ViewModel
    
    var body: some View {
        Text("Received data: \(viewModel.data)")
    }
}
  1. 在应用程序的入口处,创建一个ViewModel实例,并将其作为环境对象注入到视图层次结构中。
代码语言:txt
复制
import SwiftUI

@main
struct MyApp: App {
    @StateObject private var viewModel = ViewModel()
    
    var body: some Scene {
        WindowGroup {
            SendingView()
                .environmentObject(viewModel)
        }
    }
}

通过以上步骤,我们可以在SendingView中输入数据,并在ReceivingView中显示接收到的数据。这种数据传递方式适用于SwiftUI中的任何视图层次结构。

推荐的腾讯云相关产品:腾讯云移动开发平台(https://cloud.tencent.com/product/mpp)

请注意,以上答案仅供参考,实际实现可能因具体需求和情况而有所不同。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何SwiftUI 列表变得更加灵活

使用新速记语法 让我们从一很小特性开始,这是一非常受欢迎变化,可以使用类似 enum 速记语法来引用 SwiftUI 附带任何内置 ListStyle 类型。...为了演示这种情况,我们在 List 嵌套一 ForEach (因为在 SwiftUI ,列表变化一版都是由 ForEach 触发,而不是由 List 触发)。...然后,让我们使用另一个新功能,集合元素绑定,让系统自动为我们 articles 数组每个元素创建一可变绑定: struct ArticleList: View { @ObservedObject...} } } 要了解有关 async/await 更多信息以及如何SwiftUI使用,请查看昨天这篇文章[1],不要错过真正重要“在 Swift 认识 async/await[2]...可定制分隔符 自从引入 SwiftUI 以来,开发者们有一非常普遍要求,提供一 API ,用于隐藏或以其他自定义实现列表每个 item 之间默认分隔符。

4.9K41

Ask Apple 2022 与 SwiftUI 有关问答(上)

是否有任何建议用来检测列表行选择,类似于 “NavigationLink”,但不导航到另一个视图(例如,显示 Sheet 或从列表中选择一选项 )?...只允许打开该内容类型文件,但不能进行编辑。MVVMQ:在 UIKit 时代,MVVM 是一种常见架构,视图显示数据来自一单独 viewModel 类。...这在 SwiftUI 仍适用,还是说 struct 本身现在被视为 viewModel ?A:SwiftUI 试图与应用程序整体架构无关。...但是从一文本字段到下一文本字段聚焦感觉不够流畅,而且每当我在一文本字段输入一字母时,我 CPU 使用率似乎会飙升到 70% — 100%。...使用它们应该只创建一实例,然后可以在子视图中读取。这应该不会增加内存使用( 如果有的话,请提出反馈 )。如果你向你模型对象追加越来越多数据,你可能会增加内存使用,这是很正常

12.2K20
  • 构建稳定预览视图 —— SwiftUI 预览工作原理

    @_dynamicReplacement(for: ) @_dynamicReplacement 是实现预览功能关键机制。它用于指定某个方法作为另一个方法动态替代方法。...接下来,让我们继续查看 Xcode 是如何加载预览视图。。 在项目的 Derived Data 目录查找尾缀为 .preview-thunk.dylib 文件。...通过 XPC 发送消息指令, _XCPreviewKit 框架更新预览窗口,并在线程建进行交互与同步 用户在 Xcode 界面中看到预览效果 从预览实现可以得到部分结论 如果项目无法编译,预览也无法正常运行...,但它仍处在一功能受限环境。...在下一篇文章,我们将从开发者角度审视预览功能:它设计目的、最适宜使用场景以及如何构建稳定高效预览。

    53510

    Swift 掌握 Observation 框架

    下面将介绍如何使用观察框架来处理应用程序数据流。使用 @ObservableRevenueCat 简化了实施应用内购买、管理客户和扩展应用业务过程。...之后,我们可以观察 Store 类型任何变量。我们在 Store 类型只有一变量,用于定义存储状态。另一个字段是一永不更改 let 常量。...SwiftUI 自动跟踪在 SwiftUI ,你不需要使用 withObservationTracking 函数来观察更改。SwiftUI 自动跟踪视图正文中使用任何可观察类型属性更改。...SwiftUI 自动执行此操作。只要存储状态属性更改,SwiftUI 就会更新视图。...新观察框架结合了 Swift 并发功能,使我们能够替代苹果看似已经过时 Combine 框架。总的来说,新观察框架使 SwiftUI 数据流管理更加轻松和高效。

    23021

    如何在Xcode下预览含有Core Data元素SwiftUI视图

    如何在Xcode下预览含有Core Data元素SwiftUI视图SwiftUI诞生之日起,预览(Canvas Preview )一直是让开发者又爱又恨功能。...结合两年来我在SwiftUI使用Core Data经验和教训,我们将在本文中探讨: •导致SwiftUI预览崩溃部分原因•如何在之后开发避免类似的崩溃出现•如何在Xcode安全可靠地预览含有...作为项目代码根结构,它编译、执行时间都早于其他代码。 环境注入 SwiftUI提供了多种途径在视图之间传递数据。...直接使用托管对象 当然,我们仍然可以直接给视图传递托管对象。为了便于在预览重复使用,我们可以在CoreDataStack或其他你认为合适地方提前创建好用于预览数据,在预览时直接调用即可。...将三数据库文件(包括wal和shm)一并拖入项目中,创建一使用Bundle数据库文件NSPersistentContainer,方便我们预览使用了复杂数据模型视图

    5.1K10

    SwiftUI 动画机制

    SwiftUI 采用了声明式语法来描述不同状态下 UI 呈现,动画亦是如此。官方文档将 SwiftUI 动画(Animations)定义为:创建从一状态到另一个状态平滑过渡。...在 SwiftUI ,我们不能命令某个视图从一位置移动到另一个位置,为了实现上述效果,我们需要声明该视图在状态 A 时所处位置以及状态 B 时所处位置,当由状态由 A 转到 B 时,SwiftUI...视图和它子节点中任何依赖项发生变化,都将满足启用动画插值计算条件,并动画数据传递给作用范围内(视图和它子节点)所有可动画部件。...状态、视图标识、动画 既然 SwiftUI 动画是创建从一状态到另一个状态平滑过渡,那么我们必须对状态(依赖项)改变可能导致结果有正确认识。...总结 动画是创建从一状态到另一个状态平滑过渡 声明一动画需要三要素 掌握状态变化所能导致结果 —— 同一视图不同状态还是不同视图分支 时序曲线函数与依赖关联越精准,产生异常动画可能性就越小

    14.7K40

    AnyView 对 SwiftUI 性能影响

    前言AnyView 是一种类型擦除视图,对于 SwiftUI 容器包含异构视图非常方便。在这些情况下,你不需要指定视图层次结构中所有视图具体类型。...当使用 FPS 作为度量标准时,重要是指定最大帧速率(在这种情况下为 60),并在应用程序没有活动时丢弃值。浏览数据首先,让我们看看在浏览内容时不同实现会表现如何。...在浏览数据时修改我们可以进行另一个测试是性能测试 - 向列表发送大量内容并强制更新视图(例如,响应消息),同时我们也浏览数据。这将在较短时间间隔内触发视图多次重绘。...当需要更新视图时,仅对其进行更改(例如,向视图添加另一个反应)。有 AnyView当我们在这种情况下使用 AnyView 时,事情就变得有趣了 - 在短时间内对屏幕上视图进行频繁更新。...使用 if-else 导致视图标识丢失,就像 AnyView 一样,因此在这里没有性能差异是可以预期。这也取决于实现方式 - 你数据模型,将状态传递到哪里,哪些更新可能会导致视图重绘等等。

    11900

    如何SwiftUI 创建条形图

    系列文章 如何SwiftUI 创建条形图 SwiftUI 水平条形图 在 iOS 16 中用 SwiftUI Charts 创建一折线图 在 iOS16 中用 SwiftUI 图表定制一线图...在 Swift 图表中使用 Foudation 库测量类型 开始图表布局 SwiftUI 对探索不同布局和预览实时视图结果是很友好。...以下列表数据被作为主视图项目数据,每一条数据包含一对(名称,值)。在真正 app 里,这里数据应该通过 ViewModel 从 model 里取数据。...GeometryReader 被用来确定条形图可用高度。数据最大值得到后并传递给每个 BarView。...SwiftUI 是一很好平台,用于创建视图和快速重构独立视图。在 SwiftUI 构建条形图需要做一些工作,随着使用数据来试用条形图,可以确定更多定制化。

    5.2K10

    SwiftUI 内容边距

    今天,我们将了解 SwiftUI 引入新内容边距概念以及它与安全区域区别。创建示例让我们从一简单示例开始,演示带有一百项目的列表。...在使用 UIKit 时,我们可以访问 readableContentGuide 布局指南。从字面上看,它是另一个安全区域,适应屏幕大小,但仅适用于文本内容。...可运行 Demo提供一基于提供代码片段简化版本Swift Playground示例,用于演示如何使用contentMargins视图修饰符来管理内容边距。...随后,通过介绍 UIKit readableContentGuide 布局指南以及 SwiftUI safeAreaPadding 视图修饰符,展示了在 iPad 上适配内容边距方法。...最后,引入了 contentMargins 视图修饰符,并详细解释了其用法和参数,以及如何使用它来管理内容边距。通过本文,读者可以更好地理解并掌握 SwiftUI 内容边距管理技巧。

    16332

    如何在 Swift 取消一后台任务

    本文演示了如何明确地取消一任务,并展示了子任务是如何自动取消。 该代码建立在在 Swift 中使用 async let 并行运行后台任务编写AsyncLetApp之上。...一取消按钮被添加到视图中,其点击事件是在ViewModel调用取消方法。...一种机制是向具有异步任务对象添加状态标志,并在任务运行时监视此标志。不需要对 View 进行任何更改,取消按钮仍然调用 ViewModel cancel 函数。...中使用取消标志来结束后台循环 取消任务实例 - Task.checkCancellation() 一更优雅解决方案是为 Task 创建一状态属性,并在下载按钮操作视图中将任务分配给该属性。...此方法仍然使用Task状态属性。它被分配给下载按钮 downloadFiles 函数,任务通过视图取消按钮取消。

    2.8K30

    SwiftUI使用 @EnvironmentObject 从环境读取自定义值

    但是我们也可以将自定义对象发送到环境并在以后将它们读出来,这使我们可以在复杂应用程序更轻松地共享数据。...您已经了解了如何使用@State处理单个视图局部状态,以及@ObservedObject如何使我们在视图之间传递对象,以便我们可以共享它。...如果我们使用@ObservedObject,则需要将我们对象从每个视图传递到下一视图,直到它最终到达可以使用视图视图E,这很烦人,因为B,C和D不在乎它。...好,让我们看一些代码,这些代码展示了如何使用环境对象在两视图之间共享数据。...接下来,我们可以定义两SwiftUI视图使用我们新类。

    9.6K20

    我庆幸果断放弃了SwiftUI:它还不够成熟

    苹果传递出来消息就像是说:“SwiftUI 是一了不起用户界面框架,而且 100% 绝对会成为苹果平台上应用开发未来。”...这是一项很好技术,响应式方法非常适合许多典型基于视图需求,但对如何处理边缘情况,文档中非常缺乏相关说明。” “这是好主意,但 SwiftUI 主要问题是完全不成熟。”...但这会导致检查器值出现延迟,因此在地图编辑器交互过程(比如使用移动工具时)结果不准确,所以效果还是称不上完美。 但我觉得这可能只是独立问题,并不能因此把 SwiftUI 一棒子打死。...我需要为每个上下文创建一视图,这些视图同时又是其他视图「子视图」,然后把需要数据传递给特定视图。...但上图展示效果其实是在 AppKit 完成,因为我在 SwiftUI 一直实现不了预期功能。大家应该注意到了,中间 SpriteKit 视图上有三按钮(分别是 +、200% 和 -)。

    4.9K20

    如何使用 SwiftUI ScrollView 滚动偏移

    前言WWDC 24 已经结束,我决定开始写一些关于 SwiftUI 框架即将推出新特性文章。今年,苹果继续填补空白,引入了对滚动位置更细粒度控制。本周,我们将学习如何操作和读取滚动偏移。...提供一可以运行示例下面是一可以运行示例代码,演示如何读取和显示滚动视图位置。...我们将这个偏移量存储在 scrollOffset 状态属性并在视图底部显示当前滚动位置。...总结在本文中,我们深入探讨了 SwiftUI 框架 ScrollView 新特性,特别是如何通过 ScrollPosition 类型实现更精确滚动控制。...我们介绍了如何使用 ScrollPosition 类型进行滚动位置设置和读取,包括使用偏移量、视图标识符等方式进行操作。此外,我们还展示了如何通过动画和事件处理来增强用户体验。

    10810

    SwiftUI 状态管理系统指南

    前言 SwiftUI与苹果之前UI框架区别不仅仅在于如何定义视图和其他UI组件,还在于如何在整个使用应用程序管理视图层级状态。...SwiftUI没有使用委托、数据源或任何其他在UIKit和AppKit等命令式框架中常见状态管理模式,而是配备了一些属性包装器[1],使我们能够准确地声明我们数据如何被我们视图观察、渲染和改变。...观察和修改环境变量 最后,让我们来看看SwiftUI环境系统如何被用来在两互不直接连接视图之间传递各种状态。...尽管在一视图和它视图之间创建绑定通常很容易,但在整个视图层次结构传递某个对象或值可能相当麻烦——而这正是环境变量旨在解决问题类型。 有两种主要方法来使用SwiftUI环境。...小结 SwiftUI管理状态方式绝对是该框架最有趣方面之一,它可能需要我们稍微重新思考数据在应用传递方式——至少在涉及到将被我们UI直接消费和修改数据时是这样。

    5.1K20

    如何SwiftUI使用 AccessibilityCustomContentKey 修饰符

    本篇文章来聊聊另一个 API,我们可以使用 SwiftUI 新 accessibilityCustomContent 视图修饰符提供自定义辅助功能内容。...创建 User 结构体让我们从一简单示例开始,定义 User 结构体以及呈现 User 结构体实例视图。...我们希望使所有数据都可访问。通常,我们使用不同字体和颜色在视觉上为文本设置优先级,但是如何在辅助技术实现相同影响呢?...使用修饰符SwiftUI 通过全新 accessibilityCustomContent视图修饰符提供了一种使用不同重要性生成自定义辅助功能内容方法。让我们看看如何使用它。...可运行代码在这个示例,我们创建了一 ContentView,在其中创建了一 User 实例,并将其传递给 UserView。这个示例使用了文章第三代码段,其中包括了一些辅助功能设置。

    7200

    Ask Apple 2022 与 Core Data 有关问答 (下)

    @FetchRequest 性能如何Q:@FetchRequest 在性能方面是否优于在 ViewModel 构造方法通过 fetchRequest 获取数据方式?...通过创建两单独属性,一包含纯文本字符串,另一个包含属性字符串 Transformable 数据是否为最好方法?是否有另一种更好方式可以不通过两属性来减少存储数据量?...我也不确定 Category/Extension 作用以及如何在它和 Class 之间进行选择?A:大多数人会使用 Class,并在他们自己托管对象扩展添加他们需要任何自定义方法。...改成 String;2、声明一非可选值计算属性,并在其中对可选值属性值进行处理;3、将托管对象实例整体转换成对 SwiftUI 视图更加友好值类型。...通过 navigationDestination 传递托管对象需求Q:我有一SwiftUI navigationDestination(for: myCoreDataClass) 有关问题

    3.2K20

    避免 SwiftUI 视图重复计算

    通过 _makeProperty 方法,SwiftUI 得以实现在将视图加载到视图树时,把所需数据( 值、方法、引用等 )保存在 SwiftUI 托管数据池中,并在属性图( AttributeGraph..._value ,此时,使用 Stae 包装变量值没有被保存在 SwiftUI 托管数据池中,并且 SwiftUI 也尚未在属性图中将其作为 Source of Truth 与视图关联起来。...这是因为,我们将 Student 类型作为参数传递给了子视图SwiftUI 在比对实例时候,并不会关心子视图中具体使用了 student 哪个属性,只要 student 发生了变化,那么就会重新计算...为了解决这个问题,我们应该调整传递给子视图参数类型和内容,仅传递视图需要数据。...会在主线程上运行触发器闭包,如果闭包操作比较昂贵,可以考虑将闭包发送到后台队列 总结 本文介绍了一些在 SwiftUI 如何避免造成视图重复计算技巧,除了从中查找是否有能解决你当前问题方法外

    9.2K81
    领券