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

为什么我的状态视图在更新@ SwiftUI变量时不更新?

在 SwiftUI 中,当你使用 @State 属性包装器来声明一个变量时,它会自动创建一个状态视图。状态视图会根据变量的值来自动更新视图。然而,有时候你可能会遇到状态视图不更新的情况。

这可能是由于以下几个原因导致的:

  1. 错误使用 @State 属性包装器:确保你正确地使用了 @State 属性包装器来声明变量。它应该被放置在视图的属性之前,并且只能在视图内部使用。
  2. 值类型问题:@State 属性包装器只能用于值类型,而不能用于引用类型。如果你的变量是一个引用类型(如类),你应该使用 @ObservedObject@EnvironmentObject 属性包装器。
  3. 异步更新问题:如果你在异步任务中更新了 @State 变量的值,状态视图可能无法及时更新。在这种情况下,你可以使用 DispatchQueue.main.async 来确保在主线程上更新变量的值。
  4. 值的不可变性:@State 变量应该是可变的。如果你在更新变量时创建了一个新的值,而不是修改原始值,状态视图可能不会更新。确保你在更新变量时修改原始值。
  5. 视图层次结构问题:如果你的状态视图嵌套在其他视图中,而这些视图没有更新的话,状态视图也不会更新。确保你的视图层次结构正确,并且父视图也能够接收到变量的更新。

如果你仍然遇到状态视图不更新的问题,你可以尝试使用 @Binding 属性包装器来手动管理状态的更新。通过将 @State 变量作为参数传递给子视图,并使用 @Binding 属性包装器来接收和更新变量的值,可以确保状态视图能够正确地更新。

总结起来,当状态视图不更新时,你应该检查是否正确使用了 @State 属性包装器,处理异步更新问题,确保变量的可变性,检查视图层次结构,并尝试使用 @Binding 属性包装器来手动管理状态的更新。

腾讯云相关产品和产品介绍链接地址:

请注意,以上链接仅为示例,你可以根据具体需求选择适合的腾讯云产品。

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

相关·内容

避免 SwiftUI 视图重复计算

如果视图响应了不该响应状态,或者视图状态中包含了不该包含成员,都可能造成 SwiftUI 对该视图进行不必要更新( 重复计算 ),当类似情况集中出现,将直接影响应用交互响应,并产生卡顿状况。...原文发表于我博客 肘子 Swift 记事本 视图状态构成 可以驱动视图进行更新源被称之为 Source of Truth,它类型有: 使用 @State、@StateObject 这类属性包装器声明变量...当 SwiftUI视图视图树上删除,会一并完成对 SwiftUI 数据池以及关联清理工作。如此,使用 State 包装变量,其存续期将与视图存续期保持完全一致。...并且 SwiftUI 会在其变化时自动更新( 重新计算 )对应视图SwiftUI 上有一个困扰了不少人问题:为什么无法视图构造函数中,更改 State 包装变量值?...与符合 DynamicProperty 协议属性包装器主动驱动视图更新机制不同,SwiftUI 更新视图,会通过检查子视图实例是否发生变化( 绝大多数都由构造参数值变化导致 )来决定对子视图更新与否

9.3K81

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

众所周知,SwiftUI 是一个响应式框架,这意味着,当数据源发生变化时,框架会自动更新视图。同样,当我们想调整视图显示,应直接对状态进行修改。...原文发表博客 肘子Swift记事本视图变化在前、状态变化在后 SwiftUI 中,某些可编程控件执行一定操作,会先更新视图,待视图变化完成后再修改与其对应状态。...当视图正在滚动返回上一层视图会导致应用崩溃这是一个由 xiaogd Discord 论坛中提出 问题。...为什么状态更新滞后会导致严重错误由于 SwiftUI 不透明性,想要分析这些问题成因并不容易。...由于返回上层视图状态尚未更新,因此清理 AG (返回动画运行中),会破坏应用程序 AttributeGraph 完整性,从而导致应用程序死锁或崩溃。

707110
  • SwiftUI @State @Published @ObservedObject 深入理解和使用

    @State 介绍 因为SwiftUI View 采用是结构体,当创建想要更改属性结构体方法,我们需要添加mutating关键字,例如: mutating func doSomeWork() 然而...提示:SwiftUI中存储程序状态有几种方法,您将学习所有这些方法。@State是专门为存储一个视图简单属性而设计。...因为SwiftUI更新数据前提是触发 第一层 绑定对象 wrapperModel下属性(字段)发生更新才会调用视图更新数据 但是 第一次下绑定对象还绑定了 @ObservedObject 或者其他类型对象呢...还会触发第一次对象属性更新吗,答案是不能 你可以 didSet 事件里面捕捉,是捕捉不到,所以视图是不会更新,那这还有其他解决方案吗 有: 调用对象 wrapperModel.objectWillChange.send...() 方法告诉View 层 更新 但是这个就是绝对了吗?

    3.2K10

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

    SwiftUI 4.0 Form Ventura 上表现与以往版本有很大不同。形式上更接近 iOS 状态,同时也对 mac 进行了更多适配。...视图性能优化Q:面对复杂用户界面,控制视图更新范围最佳做法是什么( 以避免不需要转发以及重复计算 )。....}// 可以用类似字典方式对元素进行操作,快速定位,同时更新 IdentifiedArray ,也不容易引发 ForEach 异常todos[id:id] = newTodo自定义布局Q:实现自定义布局...A:你最好选择是使用 ScrollView 和 ScrollViewReader,并在 onAppear 或新内容进来时滚动到最底部视图建议尝试旋转滚动视图。...)调用 transformAnchorPreference(key:_, value:_, transform:_) or preference(key:_,value:_) 来 SwiftUI 更新视图收集坐标信息调用

    14.8K30

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

    众所周知,SwiftUI 是一个响应式框架,这意味着,当数据源发生变化时,框架会自动更新视图。同样,当我们想调整视图显示,应直接对状态进行修改。...视图变化在前、状态变化在后 SwiftUI 中,某些可编程控件执行一定操作,会先更新视图,待视图变化完成后再修改与其对应状态。这些控件基本上都是对 UIkit(AppKit)二次包装。...当视图正在滚动返回上一层视图会导致应用崩溃 这是一个由 xiaogd Discord 论坛中提出 问题[3]。...为什么状态更新滞后会导致严重错误 由于 SwiftUI 不透明性,想要分析这些问题成因并不容易。...由于返回上层视图状态尚未更新,因此清理 AG (返回动画运行中),会破坏应用程序 AttributeGraph 完整性,从而导致应用程序死锁或崩溃。

    34620

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

    ,然后 @FocusState 变量帮助下,可以隐藏一个并将焦点转移到键盘上。...A:EnvironmentObject 是一个很好工具。如果你不想让父视图也被更新,可以创建对象不使用 @StateObject 或 @ObservedObject 。...不过,传统 viewModel 意义上,建议将视图( 结构本身 )作为视图模型。...这可能会导致一些不好后果,例如使视图可重用性降低,并将业务逻辑与 SwiftUI 视图生命周期挂钩,这将使处理业务逻辑变得更加困难。简而言之,我们建议使用视图作为视图模型。...最近,注意到 SwiftUI 视图 onAppear 在意想不到时间启动,比如当 UITabBarController 被创建,而不是当视图本身出现时。

    12.3K20

    SwiftUI数据流之State&Binding

    SwiftUI中,以单一数据源(single source of truth)为核心,构建了数据驱动状态更新机制。...即使类内某个属性值发生变化,但@State监听这些,所以视图不会被重新加载。...@Binding作用是保存状态属性和更改数据视图之间创建双向连接,将当前属性连接到存储在别处单一数据源(single source of truth),而不是直接存储数据。...,这是因为@State 修饰属性所有相关操作和状态改变都应该是和当前视图生命周期保持一致,当视图没有被初始化完成,无法完成状态属性和视图之间绑定关系;_location不在是nil,其中保存了众多标记视图唯一性信息...,用于Struct中mutable值类型,它所有相关操作和状态改变和当前 View 生命周期保持一致 Binding将存储在别处值语意属性转换为引用语义,使用时需要在变量名加$符号 添加了property

    4.1K30

    AnyView 对 SwiftUI 性能影响

    浏览数据修改我们可以进行另一个测试是性能测试 - 向列表发送大量内容并强制更新视图(例如,响应消息),同时我们也浏览数据。这将在较短时间间隔内触发视图多次重绘。...当需要更新视图,仅对其进行更改(例如,向视图添加另一个反应)。有 AnyView当我们在这种情况下使用 AnyView ,事情就变得有趣了 - 短时间内对屏幕上视图进行频繁更新。...仅浏览数据,如果你将视图包装在 AnyView 中,则会比包装慢大约 10%。如果你浏览数据更改数据,则此差异将增加到约 17%,而且这些故障在这里更加明显。...例如,如果你有一个菜单,作为几个异构元素列表,点击显示不同导航目标,并且决定将这些视图包装为 AnyView,测量结果表明与使用其他方法相比,性能没有区别。...使用 if-else 导致视图标识丢失,就像 AnyView 一样,因此在这里没有性能差异是可以预期。这也取决于实现方式 - 你数据模型,将状态传递到哪里,哪些更新可能会导致视图重绘等等。

    14200

    GeometryReader :好东西还是坏东西?

    GeometryReader 更新几何信息资源消耗较大,可能会引发不必要重复计算和视图重建。...这些批评并非全无道理,其中相当一部分已经通过新 API SwiftUI 版本更新后得到了改善或解决。...对于为什么采用 Extension 方式,设计者可能考虑了以下两个因素: 通过 Binding 方式向上传递信息,并不是当前官方 SwiftUI API 主要设计方式。...这种非常规布局逻辑是推荐将其直接用作布局容器原因之一。 GeometryReader 不支持对齐指南调整,因此上面的描述使用了原点。...VStack 会结合视图优先级,它视图给其建议尺寸,摆放对子视图提出最终建议尺寸。

    63070

    SwiftUI 动画进阶 — Part4:TimelineView

    请注意,Cadence 不是你可以更改东西,而是反映设备状态东西。文档仅提供了一个例子。 watchOS 上,降低手腕 Cadence 会减慢。...例如,使用带有形状模拟时钟,或使用新 Canvas 视图绘制时钟。 但是,TimelineView 不仅仅用于时钟。许多情况下,我们希望每次时间线更新我们视图视图处理一些事情。...也就是说,时间线更新一次,然后之后立即再次,因为通过调用 quips.advance() 导致 quips.sentence @Published 值发生变化并触发视图更新。...当 TimelineView 出现时,它需要显示一些东西,以便绘制我们视图。我们将使用第一个关键帧作为我们视图状态,但是当我们循环,该帧将被忽略。...:如前所述,这种模式使我们视图每次更新计算它们主体两次:第一次是时间线更新,然后我们推进动画状态再次计算。

    3.8K30

    SwiftUI 与 Core Data —— 数据获取

    尽管在实践中,如果能在确保访问托管对象非线程安全属性前提下,非创建托管对象线程中持有托管对象并不会出现崩溃情况,但出于谨慎考虑,最终还是放弃了这种方式。...FetchRequest 获取 )由于 TCA Reducer 无法与视图存续期自动绑定,上面的可感知延迟每次触发 onAppear 都将出现最终,决定放下心结,仍然采用在视图中使用类似...当 SwiftUI 视图存续期中重新创建视图描述实例,自定义类型也将一并重新创建在视图存续期中,如果 SwiftUI 创新创建了视图描述实例,那么无论视图描述( 符合 View 协议 Struct...不可在 update 方法中同步地改变引发视图更新数据与 SwiftUI 视图更新 Source of truth 逻辑一致,一个视图更新周期中,不能对 Source of truth 再度更新...image-20221203185621897允许构造方法中不提供 NSFetchRequest当在视图中使用 @FetchRequest ,我们必须在声明 FetchRequest 变量设置 NSFetchRequest

    4.6K30

    SwiftUI 状态管理系统指南

    视图内部状态,并在该状态被改变自动使视图更新。...因此,虽然下面的内容在技术上可能会被编译,但最终会导致运行时问题——因为当我们视图更新被重新创建,UserModelController实例可能会被删除(因为我们视图现在是它主要所有者):...观察和修改环境变量 最后,让我们来看看SwiftUI环境系统如何被用来两个互不直接连接视图之间传递各种状态。...尽管一个父视图和它一个子视图之间创建绑定通常很容易,但在整个视图层次结构中传递某个对象或值可能相当麻烦——而这正是环境变量旨在解决问题类型。 有两种主要方法来使用SwiftUI环境。...希望这篇指南能成为一个很好方式来概述SwiftUI各种状态处理机制,尽管一些更具体API被遗漏了,这篇文章中强调概念应该涵盖了所有基于SwiftUI状态处理绝大多数用例。

    5.1K20

    SwiftUI - 百行代码变十行,Swift再创辉煌

    原文作者:Cooci_和谐学习_不急躁 苹果开发者大会 WWDC 2019 北京时间今天凌晨开幕。...// 为什么需要 SwiftUI // 下面是来自王巍对UIKit诟病 UIKit 提供是一套符合直觉,基于控制流命令式编程方式。...的确,我们平时开发很多时间都浪费了这个方面,然而作为牛逼也相信必然会一统江湖 Swift 也是不忍心让开发人员掉入这样坑中,SwiftUI 只是一个开始---打开新世界开始 // 声明式语法...// SwiftUI 示例代码 // 为视图任何状态声明内容和布局。SwiftUI知道该状态何时发生变化,并更新视图呈现以匹配该状态。...简便动画创建方式 创建平滑动画就像添加一个方法调用一样简单。SwiftUI需要自动计算和动画转换。

    3K40

    SwiftUI-数据流

    数据处理基本原则 Data Access as a Dependency: SwiftUI 中数据一旦被使用就会成为视图依赖,也就是说当数据发生变化了,视图展示也会跟随变化,不会像 MVC 模式下那样要不停同步数据和视图之间状态变化...@Binding 主要有两个作用: 持有数据源情况下,任意读取。 从 @State 中获取数据应用,并保持同步。...不过值类型传递时会发生复制操作,所以给传递后值类型即使属性更新了也不会触发最初传过来值类型重新赋值,所以界面并不会刷新,此时需要用@Binding,因为它可以将值类型转为引用类型,这样传递...数据流图 从上图可以看出SwiftUI 数据流转过程: 用户对界面进行操作,产生一个操作行为 action 该行为触发数据状态改变 数据状态变化会触发视图重绘 SwiftUI 内部按需更新视图,...最终再次呈现给用户,等待下次界面操作 注意 SwiftUI 中,开发者只需要构建一个视图可依赖数据源,保持数据单向有序流转即可,其他数据和视图状态同步问题 SwiftUI 帮你管理,所以 ViewController

    10.2K20

    探讨 SwiftUI几个关键属性包装器

    @State 用于管理视图私有状态。 它主要用于存储值类型数据(与视图生命周期一致)。 典型应用场景 当需要因视图数据变化而触发视图更新,@State 是理想选择。...它常用于简单 UI 组件状态管理,如开关状态、文本输入等。 如果数据不需要复杂视图共享,使用 @State 可以简化状态管理。...只有能够引发视图更新值被 get 方法读取,才会触发视图更新( 比如 @State、@StateObject ),这点对于自定义 Binding 尤为重要。...@ObservedObject 持有被观察实例,不保证其生存期。 @ObservadObject 可以视图存续期内切换其所关联实例。...它提供了一种便捷方式不同视图层级中引入共享数据,而无需显式地通过每个视图构造器传递。 典型应用场景 当需要在多个视图间共享同一个数据模型,如用户设置、主题或应用状态

    32410

    掌握 SwiftUI task 修饰器

    详情请参阅 SwiftUI 视图生命周期研究[3] 一文中有关 onAppear 和 onDisappear 章节SwiftUI 为了判断视图状态是否发生了改变,它会在视图存续期内,反复地生成视图类型实例以达成此目的...,每秒更新一次 date 变量,并且控制台中显示当前任务 ID 及时间。...Hide Timer 按钮后,app 出现了无法响应且控制台仍在持续输出( 按照原定间隔时间 )情况,为什么会出现这样问题呢?...app 无法响应是由于当前 task 是主线程上运行,如果按照下文中方法将 task 运行在后台线程之中,那么 app 将可以继续响应,但会在不显示日期文字情况下,继续更新 date 变量,并且会在控制台持续输出...以下两种情况下,SwiftUI 会给由 task 创建异步任务发送任务取消信号:视图( task 修饰器绑定视图 )满足 onDisappear 触发条件绑定值发生变化时( 采用 task 观察值变化时

    2.2K30

    一段因 @State 注入机制所产生“灵异代码”

    如果注释这行代码,fullScreenCover 中将显示 n = 2 ( 符合预期 )。这是为什么?...这意味着,即使我们定义视图结构体中声明了使用 @State 标注变量,但只要 body 中没有使用该属性( 通过 ViewBuilder 支持语法 ),即使该属性发生变化,视图也不会刷新。..., Text 中包含 n 情况下,即使 n 值改变,StateTest 视图 body 也不会重新计算。....id(n) .onChange(of:n){_ in } // id 或 onChange 均可以添加显示内容情况下,创建关联在 创建自适应高度 Sheet 推文[4] 中,便使用过 id...面对这些“灵异现象”,如果我们能对其进行更多研究,那么不仅可以今后避免类似的问题,而且分析过程中,也能对 SwiftUI 各种运行机制有深入掌握。希望本文能够对你有所帮助。

    1.9K20

    SwiftUI geometryGroup() 指南:从原理到实践

    ,至少初次接触,很难通过它来理解 geometryGroup() 真正用途。...创建黄色圆形,它无法获得状态改变前 topLeading 位置信息,因此无法满足我们要求。 本节涉及到 transaction 以及 SwiftUI 动画一些内部运行机制。...),子视图因此变化( 几何信息或导致几何信息变化状态变化)而创建了新视图 换句话说,当子视图视图几何属性发生变化时,如果子视图自身中创建了新视图,由于新视图无法获取到变化之前几何信息,因此会导致布局出现意料之外情况...geometryGroup() 确保子视图统一几何信息环境中,以实现预期布局效果。它为子视图提供了一个连续几何信息更新过程。 总结上述条件后,我们就很容易创建出其它会导致意外行为代码。...对于 iOS 16,文字变化较多且较大情况下,应尽量避免视图几何信息调整切换文字内容。 总结 本文中,我们深入探讨了 SwiftUI 中 geometryGroup() 重要性和实用性。

    28910

    Xcode 11 初体验

    SwiftUI、storyboad其中有两篇博客也介绍到了SwiftUI:SwiftUI - 百行代码变十行,Swift再创辉煌 和 WWDC - SwiftUI - 初恋般感觉 代码块 代码块也做了调整...Editor and Canvas:代码编辑器和SwiftUI预览视图。 Editor and Assistant:代码编辑器和辅助视图。...设备管理窗口中,现在增加了这几个选项 根据 Network Link 可以选择你需要状态,当然 Thermal status 可以选择!都可以让你 APP 更有预期状况下运行。...这样做有两个好处: 首先可以提高预览结果呈现速度 其次应用进入后台,不会做一些额外操作,只会做一些必要操作,使应用快速进入睡眠状态,以节省耗电....关于Swift UI 更新 其中有两篇博客也介绍到了 SwiftUI : SwiftUI - 百行代码变十行,Swift再创辉煌 WWDC - SwiftUI - 初恋般感觉 参考:Apple 官方文档一线搬砖工人

    3.2K10

    WWDC 23 ,SwiftUI 5 和 SwiftData 初印象

    ,直接定位到滚动视图特定位置,只能使用一次 )、全新滚动条控制( 闪烁 )、可自定义行视图滚动区域顶端和显示区域显示状态( 例如可用其实现类似 watchOS 中滚动到顶端子视图缩小视觉效果...不考虑兼容旧版本情况下,认为 SwiftUI 5.0 升级可以打 95 分(满分 100 分),不过考虑到很多开发者相当一段时间内还无法使用这些新功能,心情就会异常低落。...性质与通过宏创建 Observed 状态类似,可直接驱动视图更新(传递无需使用属性包装器) Attribute 派生选项被废弃了 可以 Xcode 中使用 Model Editor 将 Model...一开始看到这些信息内心无比兴奋,但很快就平静下来了,最终还有些无奈。 对于绝大多数开发者来说,一旦能够应用中使用这些新功能,苹果或许又会带来更多新诱惑。...接下来一段时间里,将在博客中介绍和探讨 SwiftUI、SwiftData 以及几个比较感兴趣新框架 TipKit 和 CKSyncEngine。

    38410
    领券