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

为什么SwiftUI中的@state变量没有改变我的视图?

SwiftUI中的@State变量没有改变视图的原因可能有以下几种:

  1. 忘记使用@State属性包装器:在使用@State变量时,需要确保正确地使用@State属性包装器。@State属性包装器用于标识一个变量是可变的,并且当该变量的值发生变化时,视图会自动更新。如果忘记使用@State属性包装器,那么变量的值改变时,视图不会自动更新。
  2. 值类型的限制:@State属性包装器只适用于值类型,例如结构体和枚举。如果尝试在类中使用@State属性包装器,那么变量的值改变时,视图不会自动更新。在这种情况下,可以考虑使用@ObservedObject或@EnvironmentObject属性包装器。
  3. 异步更新:如果尝试在异步代码块中更新@State变量的值,视图可能不会立即更新。这是因为SwiftUI会在主线程上更新视图,而异步代码块可能在后台线程上执行。为了确保视图能够正确更新,可以使用DispatchQueue.main.async将更新代码块放在主线程上执行。
  4. 值的不可变性:@State属性包装器要求变量是可变的,即可以通过赋值改变其值。如果尝试在@State变量上执行不可变操作,例如使用let关键字声明变量,那么视图不会更新。确保在需要改变视图的地方使用var关键字声明变量。

综上所述,如果SwiftUI中的@State变量没有改变视图,可以检查是否正确使用了@State属性包装器,是否在值类型中使用了@State属性包装器,是否在异步代码块中更新了@State变量的值,并确保变量是可变的。

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

相关·内容

为什么 SwiftUI 视图使用结构体

之所以说性能因素,是因为很多人认为这是 SwiftUI 使用结构体主要原因,而实际上这只是更大范围一部分。...struct or class 通常这不是问题,但是有一个名为 UIStackView 特定子类,它类似于 SwiftUI VStack 和 HStack。...在 SwiftUI ,我们所有的视图都是简单结构体,几乎可以自由创建。想想看:如果您制作一个仅包含一个整数结构体,则结构体整个大小就是:一个整数。没有其他。...没有从父类,祖父母类或曾祖父母类等继承多余值——它们完全包含您可以看到内容,仅此而已。...实际上,您不能找到比使用 Color.red 作为视图更好主意:除了“用红色填充空间”之外,它不包含任何信息。

2.4K50

为什么SwiftUI视图使用结构体?

之所以说性能因素,是因为很多人认为这是SwiftUI使用结构体主要原因,而实际上这只是更大范围一部分。...struct or class 通常这不是问题,但是有一个名为UIStackView特定子类,它类似于SwiftUIVStack和HStack。...在SwiftUI,我们所有的视图都是简单结构体,几乎可以自由创建。想想看:如果您制作一个仅包含一个整数结构体,则结构体整个大小就是:一个整数。没有其他。...得益于现代iPhone强大功能,不会慎重考虑后创建1000个整数甚至100,000个整数——眨眼之间就会发生。1000个SwiftUI视图甚至100,000个SwiftUI视图也是如此。...实际上,您不能找到比使用Color.red作为视图更好主意:除了“用红色填充空间”之外,它不包含任何信息。

3.1K10

SwiftUI 实现视图居中若干种方法

SwiftUI ,有很多手段可以达成此目的。本文将介绍其中一些方法,并对每种方法背后实现原理、适用场景以及注意事项做以说明。...因此在第一个例子,即使没有为 HStack 设置 spacing ,Text 仍然会使用全部 HStack 宽度。...().fill(.clear)在使用 SwiftUI 进行开发过程,Color、Rectangle 等经常被用来实现对容器等分操作。...布局容器对 Text 进行布局FrameLayout 给 Text 建议尺寸为 300 x 60Text 与占位视图( 空白视图尺寸为 300 x 600 )按对齐指南 center 进行对齐这是个人最喜欢使用居中手段...为本文这种通过多种方法来解决一个问题方式添加了【小题大作】标签,目前使用该便签文章还有:在 Core Data 查询和使用 count 若干方法[6]、在 SwiftUI 视图中打开 URL

6.6K40

SwiftUI数据流之State&Binding

类不需要mutating关键字,因为即使类实例被标记为常量,Swift仍然可以修改变量属性。 如果User是一个类,属性本身就不会改变,所以@State不会注意到任何东西,也无法重新加载视图。...变量,anotherFlag是没有使用属性包装器普通变量,同时增加了一个mutating方法changeAnotherFlag被设计修改anotherFlag; 在body通过几种方式对两个变量进行修改...,容易产生问题 小结:可以修改flag原因,添加了property wrapper属性,变量本身并没有变化,而是修改了由SwiftUI维护的当前struct之外变量 @State内部实现 为了进一步深入分析...,这是因为@State 修饰属性所有相关操作和状态改变都应该是和当前视图生命周期保持一致,当视图没有被初始化完成时,无法完成状态属性和视图之间绑定关系;_location不在是nil,其中保存了众多标记视图唯一性信息...$符号 添加了property wrapper属性,变量本身并没有变化,而是修改了由SwiftUI维护的当前struct之外变量 参考 https://developer.apple.com/documentation

3.9K30

为什么HibernateDaoSupport没有注入SessionFactory

前言 很早之前,就打算写这一篇文章了(其实有很多源码分析文章打算写,但是自己太拖延了导致很多文章搁浅了)。为什么要写这一文章呢?...事情缘由是同事在SpringBoot项目中有一个A类继承HibernateDaoSupport,但是程序运行总是抛出没有成功注入SessionFactory错误,后来debug Spring源码解决了这个问题...这个错误原因是A类RootBeanDefinitionautowireMode值为0,在AbstractAutowireCapableBeanFactory类populateBean方法没有执行到...autowireByName(beanName, mbd, bw, newPvs),导致SessionFactory属性没有注入成功。...beanFactory)方法不要使用beanFactory.getBean()会造成类性早熟,最终后果就是类一些属性没有成功注入。

3K10

为什么改变了对区块链看法

大学时学习密码学,而比特币作为一个新颖且非常规概念出现。在一门课程,我们分析了与比特币非常类似的加密货币密码学构建模块。尽管我钦佩算法和协议精妙,但我对 区块链技术 并不特别感兴趣。...主要保留意见是,尽管其设计创新,但它并没有解决个人认为重要任何问题。 对区块链怀疑一直持续到几个月前,当时与 Aerospike 一位新客户合作, BSV 协会。...他最多只能断言在某个技术测试版本没有发现错误。显然,这种保证级别对于核心银行系统等关键环境来说是不够。因此,如果我们打算从关系模型提供数学保证过渡,我们必须在应用程序层实施类似的保证。...在 前一篇文章 详细阐述了为什么这种方法非常低效。 通常,这些解决方案采用可扩展数据库,通过复杂数据提取、转换、加载 (ETL) 流程从不可扩展 RDBMS 检索数据。...没有不断升级复杂性。没有耗时数年、耗资数十亿美元项目来启动一个应用程序。 正是这种愿景改变对区块链看法。

7610

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

contextMenu_2022-10-26_14.01.21.2022-10-26 14_02_29如何对 @State 变量进行测试Q:对于测试 SwiftUI 视图 @State 变量是否有推荐方式...只有将这些变量重构到视图模型中去这一种方式?A:如果在同一个视图中,有多个相互关联 @State 属性,将他们提取到一个结构或许是好选择。...这有点笨拙,不认为有两个文本框是正确做法。另外,按照这种方法,@FocusState 变量会变得没有反应,而且它不能被设置为 nil( 返回到以前视图没有移除键盘 )。...比如说可以在父级视图中拥有 StateObject,并通过 EnvironmentObject 传递该对象。然而,如果里面的 @Published 属性改变了,父视图和它子树也都被重新计算。...从父视图通过环境值进行传递应该可以满足提问者当前需求:父视图可以传入新值,当前视图也可以在视图范围内改变该值。总结忽略掉了没有获得结论问题。希望上述整理能够对你有所帮助。

12.2K20

避免 SwiftUI 视图重复计算

原文发表于我博客 肘子 Swift 记事本 视图状态构成 可以驱动视图进行更新源被称之为 Source of Truth,它类型有: 使用 @State、@StateObject 这类属性包装器声明变量...仅被保存在 State 实例内部属性 _value ,此时,使用 Stae 包装变量没有被保存在 SwiftUI 托管数据池中,并且 SwiftUI 也尚未在属性图中将其作为 Source...当 SwiftUI视图视图树上删除时,会一并完成对 SwiftUI 数据池以及关联清理工作。如此,使用 State 包装变量,其存续期将与视图存续期保持完全一致。...并且 SwiftUI 会在其变化时自动更新( 重新计算 )对应视图SwiftUI 上有一个困扰了不少人问题:为什么无法在视图构造函数,更改 State 包装变量值?...创建新实例 将新实例与 SwiftUI 当前使用实例进行比对 如实例发生变化,用新实例替换当前实例,对实例 body 求值,并用新视图值替换老视图视图存续期不会因为实体更替有所改变 由于

9.2K81

​golang变量定义为什么没有python简洁?

golang变量定义为什么没有python简洁? 今天内容其实不能算一篇文章,而是学习golang时遇到一个比较有意思问题。...以前是写python和前端(vue,element,ajax,jquery,css,h5小程序...等),在学习golang时,发现其变量声明很不优雅。例子如下: ?...问题2:变量声明 关于go变量声明, go作为新起之秀,为什么不隐式声明,非得 := 这种方式呢?...像python 甚至 shell 声明变量方式如下:i,j = 42, 2701go 声明方式: i, j := 42, 2701 多一个:(冒号)不是增加了语言复杂度吗,设计上还不如python...go只是少了编译过程。变量声明和调用方式,如果go还是使用=声明,只是在C实现时候做一层转化,也有同样效果吧

96520

SwiftUI 状态管理系统指南

SwiftUI没有使用委托、数据源或任何其他在UIKit和AppKit等命令式框架中常见状态管理模式,而是配备了一些属性包装器[1],使我们能够准确地声明我们数据如何被我们视图观察、渲染和改变。...被用来表示SwiftUI视图内部状态,并在该状态被改变时自动使视图更新。...观察对象 State和Bingding共同点是,它们处理是在SwiftUI视图层次结构本身管理值。...尽管在一个父视图和它一个子视图之间创建绑定通常很容易,但在整个视图层次结构传递某个对象或值可能相当麻烦——而这正是环境变量旨在解决问题类型。 有两种主要方法来使用SwiftUI环境。...希望这篇指南能成为一个很好方式来概述SwiftUI各种状态处理机制,尽管一些更具体API被遗漏了,这篇文章强调概念应该涵盖了所有基于SwiftUI状态处理绝大多数用例。

5K20

@StateObject 研究

@StateObject 研究 如想获得更好阅读体验可以访问我博客 www.fatbobman.com 为什么要新增@StateObject 在之前文章@State研究我们探讨过@State,...为了能够让开发者更好掌控代码,同时也保持对于上一版本良好兼容性,苹果在SwiftUI2.0添加了@StateObject。顾名思义,它是@State引用类型版本。...从调试信息可以看出,当点击刷新时,CountViewObserved实例被重新创建了,并销毁了之前实例(CountViewObserved视图没有被重新创建,仅是重新求了body值)。...对个人而言,基本失去了使用其理由(可用于绑定父视图传递@StateObject)。...在下一篇文章《SwiftUI2.0 —— 100% SwiftUI app》,我们来进一步探讨。

1.1K40

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

这是为什么?...与之不同是,针对值类型主要注入手段 @StateSwiftUI 则为其实现了高度优化机制( EnvironmentValue 没有提供优化,行为与引用类型注入行为一致 )。...这意味着,即使我们在定义视图结构体声明了使用 @State 标注变量,但只要 body 没有使用该属性( 通过 ViewBuilder 支持语法 ),即使该属性发生变化,视图也不会刷新。...,在 Text 不包含 n 情况下,即使 n 值改变,StateTest 视图 body 也不会重新计算。...SheetInitMonitorView 没有任何输出( 意味着闭包没有被调用 ),只有在模态视图进行显示时,SwiftUI 才执行 .sheet 闭包函数,创建 Sheet 视图

1.9K20

SwiftUI-数据流

5.1 新特性 Property Wrapper来实现一种属性装饰语法糖(修饰器/装饰器) Property 这种形式最简单,就是在 View定义常量或者变量,然后在内部使用 import SwiftUI...用@State修饰属性,只要属性改变SwiftUI 内部会自动重新计算 Viewbody部分,构建出View Tree,由于 View 都是结构体,SwiftUI 每次构建这个 View Tree...struct ContentView: View { // 用@State修饰需要改变变量 @State private var count: Int = 0 var...ObservableObject 在应用开发过程,很多数据其实并不是在 View 内部产生,这些数据有可能是一些本地存储数据,也有可能是网络请求数据,这些数据默认是与 SwiftUI 没有依赖关系...数据流图 从上图可以看出SwiftUI 数据流转过程: 用户对界面进行操作,产生一个操作行为 action 该行为触发数据状态改变 数据状态变化会触发视图重绘 SwiftUI 内部按需更新视图

10K20

解析SwiftUI布局细节(二)循环轮播+复杂布局

具体我们Demo可以看看“”页面那个 List 代码,问题就在那里。要理解这点麻烦也给我说说,感谢!...,都比较简单,可能是就是这个 environmentObject (把它称为环境变量)这个是需要特别说明一个变量,从名字上可以看出,这个修饰符是针对全局环境。...GeometryReader 主要作用就是能够获取到父View建议尺寸,这就是它主要作用,要没有它我们面临可能就是无休止传值了,SwiftUI 既然是声明式UI,按理解你就没有办法去获取某一个视图视图之类...3、再提一点关于上面说滚动视图,在UIKit我们可以用UICollectionView搞定一切,但是在SwiftUI没有这个控件,建议采用方式是 ScrollView + HStack + VStack...= .zero /// 当前显示位置索引, /// 这是实际数据1就是数据没有被处理之前0位置图片 /// 所以这里默认从1开始 @State var currentIndex

11.8K20

高级 SwiftUI 动画 — Part 1:Paths

这些都是被官方文档完全忽略主题,在SwiftUI 帖子和文章也几乎没有提及。不过,它们还是为我们提供了创建一些相当不错动画工具。...该框架将多次重新生成视图,以小幅度增量来改变不透明度。...你可能会问,为什么需要关心所有这些小细节。SwiftUI 已经为不透明度制作了动画,而不需要担心这一切。是的,这是真的,但只要 SwiftUI 知道如何将数值从原点插值到终点。...请注意,使用了一点三角学知识。这对理解这篇文章主题并不重要,但如果你想了解更多关于它信息,写了另一篇文章,阐述了基础知识。你可以在 "SwiftUI 三角公式 "阅读更多内容。...它将打开改变我们视图和动画新方法大门。与 Paths 一样,SwiftUI 没有关于如何在两个不同变换矩阵之间转换内置知识。GeometryEffect将有助于我们这样做。

3.7K20

SwiftUI 动画机制

开发者经常需要面对:如何动、怎么动、什么能动、为什么不动、为什么这么动、如何不让它动等等困扰。对 SwiftUI 动画处理逻辑了解不够深入是造成上述困扰主要原因。...同所有 SwiftUI 视图修饰符一样,在代码中所处位置决定了修饰符作用对象和范围。 animation 作用对象仅限于它所在视图层次及该层次子节点。 上面两段代码没有对错之分。...startAnimation SwiftUI 会立即完成对 startAnimation 值改变(依赖值改变发生在动画开始前,比如本例,true 将立刻变成 false ) SwiftUI...当状态改变导致视图分支发生变化时,SwiftUI 将使用其包裹可动画部件对视图进行动画处理。 使用转场同样需要满足 SwiftUI 动画三要素。...item 指定 transition ,又一个没有在原始控件很好兼容 SwiftUI 动画例子。

14.6K40

只在视图 Body 中生存变量

但很少有人会在 body 中去使用 var 来定义变量,因为实在找不到使用 var 理由和意义。本文将探讨在 SwiftUI 视图 body 中用 var 来创建变量意义和可能场景。...不过就和通过 let _ = print("update") 能够帮助我们了解视图动态一样,掌握了在 body 通过 var 创建变量及应用方法,也将有助于开发者更好地理解 SwiftUI 视图求值逻辑并掌握其时机...为什么和想象不一样!起始点不是 0 ? 同我们不要去推断在一个视图存续期内,SwiftUI 会创建多少个该视图实例一样,我们也不应假设,在渲染第一行数据之前,body 没有被调用过。...即使不在 body 通过 var 来声明变量,我们同样可以通过使用一个引用类型实例来达成同样效果: 必须用 @State 来持有该实例,如此才能保证在视图存续期内,只有一个 holder struct...即使没有 Swift 5.8 改进,我们一样可以利用场景一替代方案来支持惰性变量: struct LazyDemo:View { @State var holder = LazyHolder

64910
领券