首页
学习
活动
专区
工具
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.8K41

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 界面中看到预览效果 从预览实现可以得到部分结论 如果项目无法编译,预览也无法正常运行...,但它仍处在一功能受限环境。...在下一篇文章,我们将从开发者角度审视预览功能:它设计目的、最适宜使用场景以及如何构建稳定高效预览。

46110

Swift 掌握 Observation 框架

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

19810

如何在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.6K40

如何SwiftUI 创建条形图

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

5.1K10

如何在 Swift 取消一后台任务

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

2.7K30

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

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

9.5K20

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

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

4.9K20

SwiftUI 状态管理系统指南

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

5K20

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

SwiftUI使用UIKit视图

本文将通过对UITextField包装来讲解以下几点: •如何SwiftUI使用UIKit视图如何让你UIKit包装视图具有SwiftUI风格•在SwiftUI使用UIKit视图需要注意地方...如果你已经对如何使用UIViewRepresentable有所掌握,可以直接从SwiftUI风格化部分阅读 基础 在具体演示包装代码之前,我们先介绍一些与在SwiftUI使用UIKit视图有关基础知识...该方法在UIViewRepresentable生命周期中会多次调用,直到视图被移出视图树(更准确地描述是切换到另一个不包含该视图视图树分支)。...因此我们需要创建协调器,并在协调器实现该方法,将录入内容传递给Demo视图name变量。...SwiftUI很多数据类型官方并不提供转换到其他框架类型方案。比如Color、Font。不过这两多写点代码还是可以转换

8.1K20

【visionOS】从零开始创建第一visionOS程序

Model3D视图加载USDZ文件或其他资产类型,并在窗口中以其固有大小显示它。在你应用已经有模型数据地方使用它,或者可以从网络上下载它。...当你准备在界面显示3D内容时,使用RealityView。这个SwiftUI视图作为你RealityKit内容容器,并允许你使用熟悉SwiftUI技术更新内容。...下面的例子展示了一使用RealityView来显示3D球体视图视图闭包代码为球体创建一RealityKit实体,在球体表面应用纹理,并将球体添加到视图内容。...当指定手势发生在实体上时,SwiftUI执行提供闭包。 下面的示例将一点击手势识别器添加到上一示例球体视图中。...如果不取消可见空间,那么当您尝试打开另一个空间时,系统将发出运行时警告。

69340

响应式架构最佳实践——MVI

应用程序应该从一Model驱动用户界面,最好是一持久性Model。Model独立于视图对象和应用程序组件,所以它们不受应用程序生命周期和相关关注点影响。...我们处理视图事件,将其转换为各自意图,并将其传递给Model。Model层使用意图和先前视图状态创建一不可变视图状态。因此,这种方式遵循单向数据流原则,即数据只在一方向流动。...总之,MVVM架构最好部分是ViewModel,但我认为它没有遵循MVC模式定义Model概念,因为在MVVM,DAO(数据访问对象)抽象被认为是Model,视图观察来自ViewModel多个可观察属性状态变化...这就是我们如何为我们任何Activity/Fragment/视图创建一ViewModel。...init{}块初始化viewState,并在需要时使用数据copy()函数进一步修改viewState。

1.6K20

SwiftUI 下定制手势

仍可使用 map 将其转换成更加易用数据类型。 手势定义形式 通常开发者会在视图内部创建自定义手势,如此代码量较少,且容易与视图中其它数据结合。...1.2 思路 在 SwiftUI 预置手势,仅有 DragGesture 提供了可用于判断移动方向数据。根据偏移量来确定轻扫方向,使用 map 将繁杂数据转换成简单方向数据。...苹果目前并没有提供应该如何实现它文档,好在 SwiftUI 提供了一含有约束默认实现。...手势在按压过程,可以根据指定时间间隔进行类似 onChanged 回调。本例程着重演示如何通过视图修饰器包装手势方法以及 GestureState 使用。...并在 updating ,调用用户提供 onEnded 闭包,并进行标记•在手势 onEnded ,如果用户提供 onEnded 闭包已经被调用,则不会再此调用•使用 State 替换 GestureState

2.6K20

打造可适配多平台 SwiftUI 应用

我们创建 deviceStatus 目的是用来观察当前应用窗口状态,故此必须应用于最宽处。在 SwiftUI ,除了环境值外,另一个具备较多平台“限制”部分就是视图 Modifier。...盲目地使用这些解决兼容性代码可能会破坏 SwiftUI 创建者苦心,让开发者无法准确地体现不同平台特色。数据源聊完兼容性后,我们再聊另一个在构建多平台应用初期容易忽略问题:数据源(数据依赖)。...当一场景被创建后,通过 onAppear 里代码,在 App State 创建属于它自己 State 数据并在场景被删除时,通过 onDisappear 里代码,将当前场景 State 清除掉...在 SwiftUI ,只要理解了状态、声明和响应之间关系,开发者就可以用任何想用形式来组织数据。无论是将状态进行统一管理,还是分散在不同视图中,都有各自优势和意义。...为了让“电影猎手”更符合 macOS 应用规范,我们将视图移动到菜单项并在 mac 代码取消了 TabView。

3.1K80

SwiftUI 布局协议 - Part2

简单说,通过添加 animatableData 属性到我们布局,我们要求 SwiftUI 动画每一帧重新计算布局。但是,在每个布局传递,角度都会收到一内插值。...我们还可以添加一改进,那就是视图旋转动画。仔细观察并比较下面三轮子:一不旋转。另外两旋转指向中心,但是一使用动画而另一个使用。...视图缩放和旋转要再一次使用双向自定义值实现。 在这个例子在容器中一共有44视图,所以我们新容器将会分别以12,12,12和8为一圈。 注意本案例如何使用缓存与子视图通信。...那我们需要是一种让布局告诉视图如何绘制线条方法。初步想法可以(在这个问题上苹果工程师是这么建议[3]) 使用布局值。这正是我们在上一例子事情,双向自定义值。...在本例,我创建了两 UUID 布局值,一标识视图另一个作为父视图 ID。

2.7K30
领券