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

我正在尝试在swiftui中实现一个视图堆栈,并且我的@State对象由于我不清楚的原因而被重置

在SwiftUI中实现视图堆栈可以使用SwiftUI的NavigationView和NavigationLink来实现。@State属性用于在视图之间共享数据,但有时可能会出现重置的情况。以下是可能导致@State对象重置的一些原因和解决方法:

  1. 视图重新加载:当视图重新加载时,@State属性会被重置。这可能是由于视图层次结构的更改或设备方向的更改引起的。为了解决这个问题,可以考虑使用@Binding属性或@EnvironmentObject来共享数据,因为它们不会在视图重新加载时重置。
  2. 对象生命周期:如果@State属性所在的对象被销毁并重新创建,@State属性也会被重置。这可能是由于视图的父视图被销毁并重新创建,或者由于使用了@ObservedObject或@EnvironmentObject属性包装的对象被重新分配。为了解决这个问题,可以考虑使用@StateObject属性包装对象,以确保对象的生命周期与视图一致。
  3. 数据流管理:如果在视图堆栈中的不同视图之间传递数据时,@State属性可能会被重置。这可能是由于数据流管理不正确或数据传递方式不正确引起的。为了解决这个问题,可以考虑使用@Binding属性或@EnvironmentObject来传递数据,以确保数据在视图之间正确共享。

总结起来,@State属性的重置可能是由于视图重新加载、对象生命周期或数据流管理等原因引起的。为了解决这个问题,可以使用@Binding属性、@EnvironmentObject属性、@StateObject属性等来共享数据,并确保正确管理数据流。在SwiftUI中实现视图堆栈时,可以使用NavigationView和NavigationLink来管理导航和视图之间的跳转。

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

相关·内容

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

A:EnvironmentObject 是一个很好工具。如果你不想让父视图更新,可以创建对象时不使用 @StateObject 或 @ObservedObject 。...锁定 Charts 纵轴刻度Q:一个 Swift 图表,通过监听拖动事件实现在拖动过程显示一个 RuleMark。拖动过程,Y 轴刻度会变大。...常规宽度下,我们详细视图中有一个带有导航堆栈侧边栏。紧凑宽度下,我们有一个标签栏,每个标签都有一个导航堆栈。...如何改善一个包含大量 UITextField 视图效率Q:一个包含 132 个 UITextField SwiftUI 视图知道这个数量很大,但这是业务逻辑决定。...目前做法是一个单例中保存对子上下文和托管对象引用,然后用一个 URL 打开一个新窗口,这个 URL 单例检查上下文和托管对象。如果我们能用自定义参数启动新窗口,那就更好了。

12.2K20

SwiftUI 4.0 全新导航系统

SwiftUI 4.0( iOS 16+ 、macOS 13+ )对导航系统作出了重大改变,提供了以视图堆栈为管理对象新 API ,让开发者可以轻松实现编程式导航。本文将对新导航系统作以介绍。...使用新编程式 API ,开发者可以轻松地实现例如:返回根视图、在当前视图堆栈添加任意视图视图跳转 )、视图外跳转( Deep Link )等功能。...: 由于无需 NavigationLink 中指定目标视图,因此无须创建多余视图实例 对同一类型值驱动目标进行统一管理( 可以将堆栈中所有视图 NavigationLink 处理程序统一到根视图中...⚠️ 使用堆栈管理系统情况下,请不要在编程式导航混用声明式导航,这样会破坏当前视图堆栈数据 下面的代码,如果点击声明式导航,将导致堆栈数据重置。...Detail 列 } } } 但如果,我们想在 Detail 栏也想嵌入一个可以实现堆栈跳转 NavigationView 则会有很大问题。

10.2K62

SwiftUI 状态管理系统指南

观察对象 State和Bingding共同点是,它们处理SwiftUI视图层次结构本身管理值。...现在,我们可以用许多不同方式来描述这样一个对象,但由于我正在寻找创建一个类型来控制我们一个模型实例——让我们把它变成一个符合SwiftUIObservableObject协议模型控制器[2]...尽管一个视图和它一个视图之间创建绑定通常很容易,但在整个视图层次结构传递某个对象或值可能相当麻烦——而这正是环境变量旨在解决问题类型。 有两种主要方法来使用SwiftUI环境。...——我们可以将其应用于我层次结构任何在其之上视图。...希望这篇指南能成为一个很好方式来概述SwiftUI各种状态处理机制,尽管一些更具体API遗漏了,这篇文章强调概念应该涵盖了所有基于SwiftUI状态处理绝大多数用例。

5K20

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

因此,如果你正在创建一个视图来显示可滚动内容,并可能进行选择操作,那么 iOS 和 macOS 上使用 List 将有最好体验。...阅读 The SwiftUI Layout Protocol [11]了解如何创建自定义布局。创建从底部开始滚动视图Q:如何实现一个底部对齐滚动视图 macOS 上会不会有糟糕性能?...macOS APIQ:对于运行 Monterey Mac,能否如何在 SwiftUI 实现下面需求建议:打开一个窗口该窗口中初始化数据找到所有打开窗口确定一个窗口是否打开从不在该窗口视图中关闭一个窗口...连锁动画Q: SwiftUI ,如何实现连锁动画?例如,想先给一个视图做动画,当动画完成后立即启动另一个动画。A:不幸是,目前不可能实现连锁动画。...Too complex to type checkQ: iOS 14 SwiftUI 遇到一个问题,试图有条件地显示 3 个符合 Shape 协议对象一个

14.7K30

@State 研究

本文试图探讨并分析SwiftUI @State实现方式和运行特征;最后提供了一个有关扩展@State功能思路及例程。读者需要对SwiftUI响应式编程有基本概念。...研究意义何在 去年底使用了SwiftUI写了第一个 iOS app 健康笔记,这是第一次接触响应式编程概念。在有了些基本认识和尝试后,深深被这种编程思路所打动。...不过,使用也发现了一些奇怪问题。发现在视图(View)数量达到一定程度,随着数据量增加,整个app响应有些开始迟钝,变得有粘滞感、不跟手。...数据(状态)驱动 SwiftUI视图数据(状态)驱动。...虽然我们MainView中使用@State声明了date,并且MainView修改了date值,但由于我们并没有MainView中使用date值来进行显示或者判断,所以无论我们如何修改date

2.9K20

避免 SwiftUI 视图重复计算

原文发表于我博客 肘子 Swift 记事本 视图状态构成 可以驱动视图进行更新称之为 Source of Truth,它类型有: 使用 @State、@StateObject 这类属性包装器声明变量...仅保存在 State 实例内部属性 _value ,此时,使用 Stae 包装变量值没有保存在 SwiftUI 托管数据池中,并且 SwiftUI 也尚未在属性图中将其作为 Source...并且 SwiftUI 会在其变化时自动更新( 重新计算 )对应视图SwiftUI 上有一个困扰了不少人问题:为什么无法视图构造函数,更改 State 包装变量值?...,ObservedObject 并不会在 SwiftUI 托管数据池中保存引用对象实例( @StateObject 会将实例保存在托管数据池中 ),仅会在属性图中创建视图视图类型实例引用对象...、应用性能表现、测试难易度等方面取得平衡 不存在完美的解决方案,即使像 TCA 这类热门项目,面对切分粒度高、层次多 State 时,也会有明显性能瓶颈 视图构造参数 尝试改善 SwiftUI

9.2K81

打造可适配多平台 SwiftUI 应用

我们创建 deviceStatus 目的是用来观察当前应用窗口状态,故此必须应用于最宽处。 SwiftUI ,除了环境值外,另一个具备较多平台“限制”部分就是视图 Modifier。...图片由于“电影猎手”采用了编程式导航,视图堆栈以及 TabView 状态都保存在 Store ,因此会出现操作同步情况。...图片图片不过,这种每个场景创建独立 Store 实例方式并非适用于所有情况。很多情况下,开发者只想在应用中保持一个 Store 实例。将通过另一个简单应用来展示这种场景。...它只有一个 Store 实例并支持多窗口,使用者每个窗口中都可以独立地切换 TabView,并且 TabView 状态唯一 Store 实例持有。...当一个场景创建后,通过 onAppear 里代码, App State 创建属于它自己 State 数据,并在场景被删除时,通过 onDisappear 里代码,将当前场景 State 清除掉

3.1K80

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

并且 SwiftUI 可以“实现一次编码,可适应五端 Apple 产品平台”, 包括watchOS、tvOS、macOS 等,以此统一苹果平台 UI 框架。...考虑到配套创作工具 CiderKit 发展成熟过程也变得愈发复杂,再加上创建各种窗口和 UI 元素实际需求,决定尝试用用 SwiftUI。...跟其他创作工具一样,这款检查器功能就是选定一个对象,并把可检查对应属性显示一个临时用户界面元素当中。...认真做了一番分析,并发现了几个问题。首先,可选对象提供视图每次重绘时都是完全重新创建。虽然通过缓存稍稍提升了性能表现,但实际体验仍然非常糟糕。...但上图展示效果其实是 AppKit 完成,因为 SwiftUI 一直实现不了预期功能。大家应该注意到了,中间 SpriteKit 视图上有三个按钮(分别是 +、200% 和 -)。

4.9K20

Ask Apple 2022 与 Core Data 有关问答

希望能够 UI 显示进度视图,以便首次启动应用程序用户可以看到他们数据正在从云中下载。A:NSPersistentCloudKitContainerEvent 填补了这个角色。...设置,存储保存到一个应用程序组目录,以允许从应用程序和扩展程序访问,所以我认为每个进程都将利用各自容器来访问它。...避免小组件执行复杂任务Q:我们遇到了一系列崩溃,因为我们一个 Widget 进程和一个应用程序进程启动了相同 CoreData 堆栈。...API 拉下时唯一约束标识对象。...uriRepresentationQ:现在正在应用程序实现一个 URL 方案,想提供一个打开特定 Core Data 对象 URL。

2.8K20

SwiftUI 之 HStack 和 VStack 切换

前言 SwiftUI 各种堆栈是许多框架中最基本布局工具,能够让我们定义组视图,这些组视图可以按照水平、垂直或覆盖视图对齐。...举个例子,假如我们正在构建一个 app 其中包含 LoginActionsView ,一个让用户登录时列表中选择操作类: struct LoginActionsView: View { .....我们用到了 fixedSize 防止按钮文本截断,这仅是我们确信给定内容视图不会比视图本身更大情况。...虽然可以 LoginActionsView 中放入该逻辑,但我们希望以后能复用代码,因此需要重新创建一个专门视图,作为一个独立组件来实现动态堆栈切换逻辑。...我们例子,这意味着我们能同时把 HStack 和 VStack 传递给它,并且代表我们它们中间自动切换。

2.8K10

打造可适配多平台 SwiftUI 应用

有关本次活动情况,可以参阅 北京参加 SwiftUI 技术沙龙[1] 一文。...我们创建 deviceStatus 目的是用来观察当前应用窗口状态,故此必须应用于最宽处。 SwiftUI ,除了环境值外,另一个具备较多平台“限制”部分就是视图 Modifier。...很多情况下,开发者只想在应用中保持一个 Store 实例。将通过另一个简单应用来展示这种场景。 想很多读者此时都不会太赞同在每个场景创建一个独立 Store 实例这种做法。...它只有一个 Store 实例并支持多窗口,使用者每个窗口中都可以独立地切换 TabView,并且 TabView 状态唯一 Store 实例持有。...当一个场景创建后,通过 onAppear 里代码, App State 创建属于它自己 State 数据,并在场景被删除时,通过 onDisappear 里代码,将当前场景 State 清除掉

2K10

高级 SwiftUI 动画 — Part 1:Paths

这些都是官方文档完全忽略主题,SwiftUI 帖子和文章也几乎没有提及。不过,它们还是为我们提供了创建一些相当不错动画工具。...我们进入这些隐藏瑰宝之前,想对一些基本 SwiftUI 动画概念做一个非常快速总结。只是为了让我们能有共同语言,请耐心听我说。...当给一个视图制作动画时,SwiftUI 实际上是多次重新生成该视图并且每次都修改动画参数。这样,它就会从原点值渐渐走向最终值。 假设我们为一个视图不透明度创建一个线性动画。...请注意,使用了一点三角学知识。这对理解这篇文章主题并不重要,但如果你想了解更多关于它信息,写了另一篇文章,阐述了基础知识。你可以 "SwiftUI 三角公式 "阅读更多内容。...SwiftUI + Metal 如果你发现自己正在编写复杂动画,你可能会开始看到你设备受到影响,同时试图跟上所有的绘图。如果是这样,你肯定会从启用金属使用受益。

3.7K20

SheetKit——SwiftUI模态视图扩展库

主要因为SwiftUI重要视图展示模式:NavigationView、Sheet等都没有迅捷、简便重置能力。很难通过一两句代码将应用程序立即设置成我们想要视图状态。...因此,在此种情况下,通常我们会将所有的模态视图集中管理起来,统一调用。请参阅之前文章——SwiftUI,根据需求弹出不同Sheet[3]。...•新半高模态视图WWDC 2021,苹果为大家带来了期待已久半高模态视图。或许推出比较仓促,这种很受欢迎交互方式并没有提供SwiftUI版本,仅支持UIKit。...Notification.Name dismissAllSheets image-20210916190651604 SheetKit支持快速取消全部正在显示模态视图(无论该模态视图是否SheetKit...SwiftUI3.0,已经可以使用原生API生成各种毛玻璃效果了。但只有将模态视图背景设置为透明,毛玻璃效果才能显现出来。

2.9K20

SwiftUI 与 Core Data —— 数据获取

本文中我们将探讨 SwiftUI 视图中批量获取 Core Data 数据方式,并尝试创建一个可以使用 mock 数据 FetchRequest。...也做了不少尝试,但最终发现似乎 FetchRequest 仍是当前 SwiftUI 最优解。...简单介绍一下探索过程( 以 TCA 框架进行举例 ): Reducer 获取并管理值数据 task( 或 onAppear )通过发送 Action 启动一个长期 Effect ,创建一个...尽管在实践,如果能在确保不访问托管对象非线程安全属性前提下,非创建托管对象线程持有托管对象并不会出现崩溃情况,但出于谨慎考虑,最终还是放弃了这种方式。...创建自定义 DynamicProperty 类型时,需要注意以下几点:可以自定义类型中使用环境值或环境对象视图加载后,视图中所有符合 DynamicProperty 协议类型也将一并具备访问环境数据能力

4.6K30

视图 Body 中生存变量

View 协议,body 属性包装器 @ViewBuilder 所标注,这意味着,通常我们只能在 body 中使用 ViewBuilder 认可 Expression 来声明视图( 如果显式使用...为什么和想象不一样!起始点不是 0 ? 同我们不要去推断一个视图存续期内,SwiftUI 会创建多少个该视图实例一样,我们也不应假设,渲染第一行数据之前,body 没有调用过。... SwiftUI 所有的惰性容器,都会出现计算两次情况( 或许与惰性容器视图值保存机制有关 ),这就要求我们为了得到正确 offset 值必须进行除 2 操作。...即使不在 body 通过 var 来声明变量,我们同样可以通过使用一个引用类型实例来达成同样效果: 必须用 @State 来持有该实例,如此才能保证视图存续期内,只有一个 holder struct...@State + onAppear 也能实现类似的效果,不过会让视图多刷新一次。如果计算时间真的较长( 会导致视图停滞 ),通过 task 中使用异步方法才是更好选择。

65210

解析 SwiftUI 两处状态更新滞后引发严重 Bug

原文发表博客 肘子Swift记事本视图变化在前、状态变化在后 SwiftUI ,某些可编程控件执行一定操作时,会先更新视图,待视图变化完成后再修改与其对应状态。...通过手势取消 Sheet 后,快速右滑导航容器会导致应用锁死这是一个 SwiftUI 所有版本存在错误,你可以众多论坛或聊天室里看到不少开发者都在寻找解决方法。...,左上角 Back 按钮将消失,但视图并没有返回根视图图片如果告诉你,上述情况正是前文提到状态更新滞后所导致,那么你该如何避免这个问题呢?...当视图正在滚动时返回上一层视图会导致应用崩溃这是一个 xiaogd Discord 论坛中提出 问题。...我们遇到问题两个场景,应用程序都恰好使用了导航容器,并且通过特定操作,使 RunLoop 处于了适合 AG 打包更新状态。

589110

ObservableObject研究

•这些状态都保存在一个 Store 对象,被称为 State。•View 不能直接操作 State,而只能通过发送 Action 方式,间接改变存储 Store State。...总的来说,当前SwiftUI框架下,大家实现手段主要不同都体现在细节上,大方向、模式、代码构成基本都差不多: •Store对象遵守ObservableObject协议•State保存在Store...它为Swift代码实现DSL带来了极大便利。不过作为一个新生产物,它目前能力还并不十分强大。...区域范围内来创建维持一个状态,主要可以使用以下几种手段: •善用@State @State研究 这篇文章,我们讨论了SwiftUI对于@State优化问题。...上述代码已经放到了Github 总结 之所以进行这方面的探讨是由于我app出现了响应粘滞(和我心目中iOS平台上该有的丝滑感有落差)。研究学习过程也让SwiftUI有了进一步认识。

2.4K60

SwiftUI 布局:如何自定义 AlignmentGuides

水平堆栈内部包含两个垂直堆栈,因此没有内置方法来获得所需对齐方式——像HStack(alignment: .top) 这样方便方式。 要解决这个问题,我们需要定义一个自定义布局指南。...当我说“自定义类型”时,您可能会想到一个结构体,但实际上,将其作为枚举来实现一个好主意,将很快解释。...您将获得视图现有ViewDimensions对象,因此您可以选择其中一个作为默认值,也可以使用硬编码值。....top视图维度,并且还创建了一个名为midAccountAndName静态常量,以使自定义对齐更易于使用。...建议您尝试我们示例前后添加更多文本视图SwiftUI 将重新定位所有内容,以确保我们对齐两个视图保持不变。

98410

SwiftUI + Core Data App 内存占用优化之旅

本文将通过对一个演示 App 进行逐步内存优化方式( 原先显示 100 条数据要占用 1.6 GB 内存,优化至显示数百条数据仅需 200 多 MB 内存 ),让读者对 SwiftUI 视图存续期...第一轮优化:对视图 body 值进行优化 第一轮优化,我们会首先尝试SwiftUI 角度入手。...也就是说,如果我们能让数据仅在视图出现在惰性容器可见范围内,才创建一个指向该数据托管对象并且视图离开可视区域时,删除该对象( 放弃引用 ),那么就可以通过 Core Data 自身内存释放机制来完成本轮优化...根据上述原理,我们将尝试如下过程: onAppear 闭包,通过私有上下文创建一个 Picture 对象 将 data 属性数据转换成 Image,并保存在视图一个 Source of truth... 视图显示该 Image onAppear 闭包运行结束时,Picture 对象将自动释放 onDisapper 清除 Source of truth 内容( 设置为 nil ) 按照预想

2.4K40

SwiftUI + Core Data App 内存占用优化之旅

本文将通过对一个演示 App 进行逐步内存优化方式( 原先显示 100 条数据要占用 1.6 GB 内存,优化至显示数百条数据仅需 200 多 MB 内存 ),让读者对 SwiftUI 视图存续期...下文中,我们将对这段代码进行逐步优化,以达到最终可用程度。 第一轮优化:对视图 body 值进行优化 第一轮优化,我们会首先尝试SwiftUI 角度入手。...也就是说,如果我们能让数据仅在视图出现在惰性容器可见范围内,才创建一个指向该数据托管对象并且视图离开可视区域时,删除该对象( 放弃引用 ),那么就可以通过 Core Data 自身内存释放机制来完成本轮优化...根据上述原理,我们将尝试如下过程: onAppear 闭包,通过私有上下文创建一个 Picture 对象 将 data 属性数据转换成 Image,并保存在视图一个 Source of truth... 视图显示该 Image onAppear 闭包运行结束时,Picture 对象将自动释放 onDisapper 清除 Source of truth 内容( 设置为 nil ) 按照预想

1.2K10
领券