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

为什么这个状态视图在更改@ SwiftUI变量时不更新?

在SwiftUI中,当我们更改一个变量时,视图应该自动更新以反映变量的新值。然而,有时候我们可能会遇到一个问题,即当我们更改变量时,视图并没有更新。这可能是由于以下几个原因导致的。

  1. 缺少@State修饰符:在SwiftUI中,我们需要使用@State修饰符来声明一个状态变量,以便使视图能够观察并响应其变化。如果我们忘记在变量前添加@State修饰符,视图将无法检测到变量的更改,从而无法更新。
  2. 值类型问题:Swift是一门强类型语言,它区分值类型和引用类型。如果我们的变量是一个值类型(如结构体),并且我们在更改变量时没有使用mutating关键字,那么视图将无法检测到变量的更改。为了解决这个问题,我们可以将变量声明为@State或使用@Binding来传递变量的引用。
  3. 异步更新问题:有时候,我们可能在异步任务中更改变量的值,而视图无法及时更新。这是因为SwiftUI的视图更新是在主线程上进行的,而异步任务可能在后台线程上执行。为了解决这个问题,我们可以使用DispatchQueue.main.async将变量的更改包装在主线程上。
  4. 视图层次结构问题:如果我们的视图层次结构不正确,可能会导致视图无法正确更新。例如,如果我们的变量是在子视图中更改的,但父视图没有正确地传递变量的引用,那么父视图将无法检测到变量的更改。确保正确设置视图层次结构和变量传递是解决这个问题的关键。

综上所述,当状态视图在更改@SwiftUI变量时不更新时,我们应该检查是否正确使用了@State修饰符,处理了值类型问题,处理了异步更新问题,并确保正确的视图层次结构和变量传递。如果问题仍然存在,可能需要进一步调试和排查。

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

相关·内容

避免 SwiftUI 视图的重复计算

SwiftUI视图视图树上删除,会一并完成对 SwiftUI 数据池以及关联的清理工作。如此,使用 State 包装的变量,其存续期将与视图的存续期保持完全一致。...并且 SwiftUI 会在其变化时自动更新( 重新计算 )对应的视图SwiftUI 上有一个困扰了不少人的问题:为什么无法视图的构造函数中,更改 State 包装的变量值?...其他建议 需要跳跃视图层级,考虑使用 Environment 或 EnvironmentObject 对于紧密的 State 关系,考虑同一个视图层级使用多个 EnvironmentObject...与符合 DynamicProperty 协议的属性包装器主动驱动视图更新的机制不同,SwiftUI 更新视图,会通过检查子视图的实例是否发生变化( 绝大多数都由构造参数值的变化导致 )来决定对子视图更新与否...当触发器接收到事件后,无论其是否更改当前视图的其他状态,当前的视图都会被更新

9.2K81

SwiftUI数据流之State&Binding

SwiftUI中,以单一数据源(single source of truth)为核心,构建了数据驱动状态更新的机制。...struct的拷贝,所以其中一个View的struct值发生变化,对另一个没有影响;反之,如果是class则会互相影响; 当User是一个结构体,每次我们修改这个结构体的属性,Swift实际上是创建一个新的结构体实例...即使类内的某个属性值发生变化,但@State监听这些,所以视图不会被重新加载。...@Binding的作用是保存状态的属性和更改数据的视图之间创建双向连接,将当前属性连接到存储在别处的单一数据源(single source of truth),而不是直接存储数据。...,这是因为@State 修饰的属性的它的所有相关操作和状态改变都应该是和当前视图生命周期保持一致,当视图没有被初始化完成,无法完成状态属性和视图之间的绑定关系;_location不在是nil,其中保存了众多标记视图唯一性的信息

3.9K30

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

@State 介绍 因为SwiftUI View 采用的是结构体,当创建想要更改属性的结构体方法,我们需要添加mutating关键字,例如: mutating func doSomeWork() 然而...@State允许我们绕过结构体的限制:我们知道不能更改它们的属性,因为结构是固定的,但是@State允许SwiftUI将该值单独存储可以修改的地方。...提示:SwiftUI中存储程序状态有几种方法,您将学习所有这些方法。@State是专门为存储一个视图中的简单属性而设计的。...还会触发第一次对象属性更新吗,答案是不能的 你可以 didSet 事件里面捕捉,是捕捉不到的,所以视图是不会更新的,那这还有其他解决方案吗 有: 调用对象 wrapperModel.objectWillChange.send...@Published 字段更新 就会调用View视图进行更新 /// BaseModel里面实现 notifyUpdate 更新当前对象 _lastUpdateTime 字段,实现自身全部字段更新

2.9K10

SwiftUI-数据流

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

10K20

Swift 掌握 Observation 框架

之后,我们可以观察 Store 类型中的任何变量。我们 Store 类型中只有一个变量,用于定义存储的状态。另一个字段是一个永不更改的 let 常量。...你还应该注意的另一件事是 onChange 闭包在实际更改应用之前运行。这就是为什么我们通过启动新任务来推迟 onChange 操作的原因。...SwiftUI 自动跟踪 SwiftUI 中,你不需要使用 withObservationTracking 函数来观察更改SwiftUI 自动跟踪视图正文中使用的任何可观察类型属性的更改。...SwiftUI 自动执行此操作。只要存储的状态属性更改SwiftUI 就会更新视图。...我们不需要 @ObservedObject 属性包装器来跟踪可观察类型中的更改,但我们仍然需要 @StateObject 替代项以 SwiftUI 生命周期中存活。

18610

SwiftUI 动画进阶 — Part4:TimelineView

典型的例子,是避免具有秒或分钟节奏的调度程序的时钟上显示毫秒。 请注意,Cadence 不是你可以更改的东西,而是反映设备状态的东西。文档仅提供了一个例子。...为了解决这个问题,我们更改了 SubView 视图以添加一个参数,该参数将随着时间轴的每次更新而改变。请注意,我们不需要使用参数,它只需要在那里。尽管如此,我们将看到这个未使用的值稍后会非常有用。...也就是说,时间线更新一次,然后之后立即再次,因为通过调用 quips.advance() 导致 quips.sentence 的 @Published 值发生变化并触发视图更新。... TimelineView 与新的 Canvas 视图结合使用时,这将非常有用。 EveryMinuteTimelineSchedule:顾名思义,它每分钟更新一次,每分钟开始更新。...:如前所述,这种模式使我们的视图每次更新计算它们的主体两次:第一次是时间线更新,然后我们推进动画状态再次计算。

3.7K30

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

视图的性能优化Q:面对复杂的用户界面,控制视图中的更新范围的最佳做法是什么( 以避免不需要的转发以及重复计算 )。...A:和很多事情一样,这个问题的答案是取决于你的使用情况( 无论这个答案多么令人满意:sweat_smile: )。...除此以外,当你试图实现一个可以各种情况下使用通用的布局,一定要考虑!但是,如果你只是自己使用它,并且条件可控,那么处理这些情况也是合理的。...这个技巧对于处于屏幕的顶部或底部的视图十分有用。详情请参阅 推文[15] 。动画转场Q:为什么下面的代码没有显示动画转场。...)调用 transformAnchorPreference(key:_, value:_, transform:_) or preference(key:_,value:_) 来 SwiftUI 更新视图收集坐标信息调用

14.7K30

Xcode 11 初体验

Editor and Canvas:代码编辑器和SwiftUI预览视图。 Editor and Assistant:代码编辑器和辅助视图。...当你的项目关联了版本控制工具,比如 Git, Xcode 会检测出当前文件哪些地方相对于上次递交的版本有更改,并且会通过左边显示一个蓝色线条标记出来: Change Bar 点击左键还可以选择 show...为什么这么说呢?...Resolving 三方框架 设计工具(Design Tools) 可以随时查看各设备上的效果以及作出更改开发和调试,随时暗黑和明亮模式之间进行切换。...这样做有两个好处: 首先可以提高预览结果呈现的速度 其次应用进入后台,不会做一些额外的操作,只会做一些必要的操作,使应用快速进入睡眠状态,以节省耗电.

3.1K10

Swift 周报 第四十一期

探索多个时区以多种语言进行的活动。 提案 正在审查的提案 SE-0412[2] 全局变量的严格并发性 提案正在审查。 该提案定义了产生数据竞争的情况下使用全局变量的选项。...Swift论坛 讨论Swift 6 语言模式的进展[3] 自上次更新为 Swift 6 语言模式 94 制定设计优先事项以来,该项目一直稳步推进,朝着这个下一个里程碑迈进。...其他 Swift 6 可能包括源兼容更改的演进提案,语言指导组将在评估这类提案是否相对于源兼容的成本对语言的价值逐个进行评估。...当初审查 SE-0192 ,这种引入兼容源代码更改的方法是不可用的,但今天我们认为这是完成此功能的最合适,事实上是我们唯一明智的选择。...使用了相对新但规模较小的 Verse 编程语言几个月后,我开始喜欢能够 if 语句的条件列表中创建中间常量和变量,以及执行常规函数的能力。 我开始思考为什么 Swift 没有这样相当方便的功能。

20540

打造可适配多平台的 SwiftUI 应用

我们视图代码中依赖这个环境值越多,将来需要做的调整也就越多。...图片为了避免适配其他平台重复调整代码,我们可以采用类似于 horizontalSizeClass 的方式(通过环境变量),创建一个可用于所有需要适配平台的自定义环境变量来解决这个问题。...图片为什么会出现这种情况呢?我们都知道 SwiftUI 是一个声明式框架。这不仅意味着开发者可以通过声明的方式来构造视图,而且场景(对应着独立的窗口)甚至整个 App 都是基于声明式代码来创建的。...图片我们设计这个 App 的状态,就要考虑到哪些是应用全局的状态,哪些是仅限于当前场景(窗口)的状态。... SwiftUI 中,只要理解了状态、声明和响应之间的关系,开发者就可以用任何想用的形式来组织数据。无论是将状态进行统一管理,还是分散不同的视图中,都有各自的优势和意义。

3K80

打造可适配多平台的 SwiftUI 应用

我们视图代码中依赖这个环境值越多,将来需要做的调整也就越多。...image-20230416170832640 为了避免适配其他平台重复调整代码,我们可以采用类似于 horizontalSizeClass 的方式(通过环境变量),创建一个可用于所有需要适配平台的自定义环境变量来解决这个问题...RocketSim_Screenshot_iPad_Pro_11'_2023-04-24_10.15.30 我们设计这个 App 的状态,就要考虑到哪些是应用全局的状态,哪些是仅限于当前场景(窗口)... SwiftUI 中,只要理解了状态、声明和响应之间的关系,开发者就可以用任何想用的形式来组织数据。无论是将状态进行统一管理,还是分散不同的视图中,都有各自的优势和意义。... iOS 中,我们通过视图( ContentView )中修改环境值的方式来更改颜色和语言,并不会对 macOS 的 Settings 场景产生影响。

1.9K10

SwiftUI 与 Core Data —— 数据获取

SwiftUI 视图存续期中重新创建视图描述实例,自定义类型也将一并重新创建在视图存续期中,如果 SwiftUI 创新创建了视图描述实例,那么无论视图描述( 符合 View 协议的 Struct...不可在 update 方法中同步地改变引发视图更新的数据与 SwiftUI 视图更新 Source of truth 的逻辑一致,一个视图更新周期中,不能对 Source of truth 再度更新...这意味着,尽管我们只能在 update 方法中更改数据,但必须要想办法错开该更新周期。...image-20221203185621897允许构造方法中不提供 NSFetchRequest当在视图中使用 @FetchRequest ,我们必须在声明 FetchRequest 变量设置 NSFetchRequest...( @State 中持有引用 ),便可以达成如下目的:1、让数据的生命周期与视图生存期一致;2、数据可更改;3、更改数据不会引发视图更新

4.6K30

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

contextMenu_2022-10-26_14.01.21.2022-10-26 14_02_29如何对 @State 变量进行测试Q:对于测试 SwiftUI 视图中的 @State 变量是否有推荐的方式...如果你不想让父视图也被更新,可以创建对象不使用 @StateObject 或 @ObservedObject 。...不过,传统的 viewModel 意义上,我建议将视图( 结构本身 )作为视图模型。...这可能会导致一些不好的后果,例如使视图的可重用性降低,并将业务逻辑与 SwiftUI 视图的生命周期挂钩,这将使处理业务逻辑变得更加困难。简而言之,我们建议使用视图作为视图模型。...WindowGroup 和 OpenWindowActionQ: macOS 上是否可以创建新窗口附加参数?我同一个子上下文中创建一个新的托管对象,并希望将这个对象发送到一个新的窗口。

12.2K20

深度解读 Observation —— SwiftUI 性能提升的新途径

WWDC 2023 中,苹果介绍了 Swift 标准库中的新成员:Observation 框架。它的出现有望缓解开发者长期面临的 SwiftUI 视图无效更新问题。...减少 SwiftUI 中对视图的无效更新,提高应用性能。...SwiftUI视图如何观察属性的变化 根据 Observation 框架的工作原理,我们可以推测 SwiftUI 大概会采用下面的方法可观察属性与视图更新之间创建联系: struct A:View...SwiftUI 将根据可观察对象视图中的注入方式选择对应的观察手段。 例如,上文中同时满足两种观察途径的可观察对象,根据其注入的方式不同,SwiftUI 采用的更新策略也将不同。...另外, 我们之前视图中很多的优化技巧也将发生改变。例如,使用 ObservableObject ,我们会通过只引入与当前视图有用的数据,来减少不必要的刷新。

47720

掌握 SwiftUI 的 task 修饰器

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

2.2K30

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

众所周知,SwiftUI 是一个响应式框架,这意味着,当数据源发生变化时,框架会自动更新视图。同样,当我们想调整视图显示,应直接对状态进行修改。...原文发表我的博客 肘子的Swift记事本视图变化在前、状态变化在后 SwiftUI 中,某些可编程控件执行一定的操作,会先更新视图,待视图变化完成后再修改与其对应的状态。...,左上角的 Back 按钮将消失,但视图并没有返回根视图图片如果我告诉你,上述情况正是由前文提到的状态更新滞后所导致,那么你该如何避免这个问题呢?...为什么状态更新滞后会导致严重错误由于 SwiftUI 的 不透明性,想要分析这些问题的成因并不容易。...由于返回上层视图状态尚未更新,因此清理 AG (返回动画运行中),会破坏应用程序的 AttributeGraph 完整性,从而导致应用程序死锁或崩溃。

570110

SwiftUI 状态管理系统指南

视图的内部状态,并在该状态被改变自动使视图更新。...因此,虽然下面的内容在技术上可能会被编译,但最终会导致运行时的问题——因为当我们的视图更新被重新创建,UserModelController实例可能会被删除(因为我们的视图现在是它的主要所有者):...观察和修改环境变量 最后,让我们来看看SwiftUI的环境系统如何被用来两个互不直接连接的视图之间传递各种状态。...尽管一个父视图和它的一个子视图之间创建绑定通常很容易,但在整个视图层次结构中传递某个对象或值可能相当麻烦——而这正是环境变量旨在解决的问题类型。 有两种主要的方法来使用SwiftUI的环境。...小结 SwiftUI管理状态的方式绝对是该框架最有趣的方面之一,它可能需要我们稍微重新思考数据应用中的传递方式——至少涉及到将被我们的UI直接消费和修改的数据是这样。

5K20

掌握 SwiftUI 的 task 修饰器

详情请参阅 SwiftUI 视图的生命周期研究 一文中有关 onAppear 和 onDisappear 的章节 SwiftUI 为了判断视图状态是否发生了改变,它会在视图的存续期内,反复地生成视图类型实例以达成此目的...date 变量,并且控制台中显示当前的任务 ID 及时间。...app 无法响应是由于当前 task 是主线程上运行的,如果按照下文中的方法将 task 运行在后台线程之中,那么 app 将可以继续响应,但会在不显示日期文字的情况下,继续更新 date 变量,并且会在控制台持续输出...以下两种情况下,SwiftUI 会给由 task 创建的异步任务发送任务取消信号: 视图( task 修饰器绑定的视图 )满足 onDisappear 触发条件 绑定的值发生变化时( 采用 task...作为一个事件源类型的 Source of Truth,每当接收到一个新的消息,它都会导致 SwiftUI视图的 body 重新求值。

3.5K60
领券