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

在SwiftUI中重绘视图时运行

在SwiftUI中,视图的重绘通常是由数据的变化触发的。当视图绑定到的数据发生变化时,SwiftUI会自动重新调用视图的body属性来获取新的视图表示,这个过程就是视图的重绘。

基础概念

  • 视图(View):SwiftUI中的基本构建块,负责显示内容和处理用户交互。
  • 属性包装器(Property Wrapper):用于封装视图属性,以便在属性值更改时自动更新视图。
  • ObservableObject:一个协议,用于标记遵循它的类可以观察属性的变化。
  • @State@ObservedObject@StateObject@EnvironmentObject:SwiftUI中的属性包装器,用于管理状态和对象。

优势

  • 声明式编程:SwiftUI采用声明式编程范式,使得UI的描述更加直观和简洁。
  • 自动更新:SwiftUI自动处理视图的更新,开发者无需手动调用更新方法。
  • 跨平台:SwiftUI可以在iOS、macOS、watchOS和tvOS上使用。

类型

  • 结构体视图:大多数SwiftUI视图都是结构体,它们是值类型。
  • 类视图:虽然不常见,但SwiftUI也支持类视图,它们是引用类型。

应用场景

  • 数据绑定:当数据模型发生变化时,与之绑定的视图会自动更新。
  • 用户界面:构建各种用户界面元素,如按钮、文本框、列表等。
  • 响应式编程:创建响应用户操作或其他事件的动态UI。

问题与解决

如果你在SwiftUI中遇到了视图不重绘的问题,可能是以下几个原因:

  1. 数据未标记为可观察:确保使用@State@ObservedObject等属性包装器标记数据。
  2. 数据变化未被检测:确保数据的变化是可检测的,例如使用可变类型而不是不可变类型。
  3. 视图更新逻辑错误:检查body属性中的逻辑,确保它正确地响应数据变化。

示例代码

代码语言:txt
复制
import SwiftUI

struct ContentView: View {
    @State private var count = 0

    var body: some View {
        VStack {
            Text("Hello, SwiftUI!")
            Text("Count: \(count)")
            Button(action: {
                count += 1
            }) {
                Text("Increment")
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

在这个例子中,每当用户点击按钮时,count的值会增加,由于count@State包装,SwiftUI会自动重新调用body属性来更新视图。

参考链接

如果你需要更多关于SwiftUI的信息或者遇到具体的技术问题,可以参考上述链接或直接在SwiftUI的官方文档中查找解决方案。

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

相关·内容

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

欢迎大家 Discord 频道[2] 中进行更多地交流将某个视图视图中居中显示是一个常见的需求,即使对于 SwiftUI 的初学者来说这也并非难事。... SwiftUI ,有很多手段可以达成此目的。本文将介绍其中的一些方法,并对每种方法背后的实现原理、适用场景以及注意事项做以说明。...HStack、VStack 进行布局,会为每个子视图提供四种不同的建议模式( 最小、最大、明确尺寸以及未指定 ),如果子视图不同的模式下返回的需求尺寸是不一样的,则意味着该视图是可变尺寸视图。...().fill(.clear)使用 SwiftUI 进行开发的过程,Color、Rectangle 等经常被用来实现对容器的等分操作。...我为本文这种通过多种方法来解决一个问题的方式添加了【小题大作】标签,目前使用该便签的文章还有: Core Data 查询和使用 count 的若干方法[6]、 SwiftUI 视图中打开 URL

6.7K40

SwiftUI accessibilityChildren 视图修饰符的作用

前言SwiftUI 为我们提供了一系列丰富的视图修饰符,用于操作视图的可访问性树。我已经介绍了其中许多,你可以博客中找到它们。...我们无法为每个数据点提供可访问性值,因为描边或填充形状后,该形状将成为一个单一视图。...SwiftUI 不会渲染我们通过 ViewBuilder 闭包传递的视图,它仅用于填充可访问性树的子元素。...完整代码首先,你需要定义 DataPoint 结构体,然后可以 ContentView 初始化 dataPoints 数组。...在上述代码,将柱状图填充颜色设为红色。您可以根据需要自行更改填充颜色。运行截图:总结今天,我们了解了 SwiftUI 为我们提供的又一个强大的可访问性视图修饰符。

9320
  • AnyView 对 SwiftUI 性能的影响

    浏览数据修改我们可以进行的另一个测试是性能测试 - 向列表发送大量内容并强制更新视图(例如,响应消息),同时我们也浏览数据。这将在较短的时间间隔内触发视图的多次。...在此场景,有几个可见的卡顿和挂起,当我们频繁响应消息,FPS 降至 50 以下。由于几秒钟内强制视图多次,帧丢失在这里更加明显。...由于 SwiftUI 不知道这个视图是什么,我假设它每次都会从头开始。其中一些视图相当昂贵(例如 GIF),因此重新绘制可能是一项相当昂贵的操作。...仅浏览数据,如果你将视图包装在 AnyView ,则会比不包装慢大约 10%。如果你浏览数据更改数据,则此差异将增加到约 17%,而且这些故障在这里更加明显。...这也解释了为什么 AnyView 实现随着时间的推移变慢 - 每次都需要从头开始创建更多内容。总结总而言之,在这些情景(包含异构视图的可滚动列表),最好为容器的不同视图使用具体类型。

    11700

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

    运行良好,所以我根本想象不到后续会出什么大乱子。 但在开始实现更复杂的检查器视图,特别是涉及带有 / 不带步进器或颜色选择器的多个文本字段,整个运行速度开始剧烈下降。...但每当 SwiftUI 更新检查器视图(这种更新可能出现在移动过程,甚至是输入文本字段的时候),渲染速率都会下降到每秒 10 到 15 帧,而且相当不稳定。这显然让人无法容忍。...首先,由可选对象提供的视图每次都是完全重新创建。我虽然通过缓存稍稍提升了性能表现,但实际体验仍然非常糟糕。事实证明,SwiftUI 检查器视图就是没法提供合理的速度。...但这会导致检查器的值出现延迟,因此地图编辑器的交互过程(比如使用移动工具)结果不准确,所以效果还是称不上完美。 但我觉得这可能只是个独立问题,并不能因此把 SwiftUI 一棒子打死。...我打算在 Nihongo no Kana 的更新版本再用用 SwiftUI,毕竟那款 iOS/iPadOS 应用的频率低得多,所以应该不会有太大问题。

    4.9K20

    为什么SwiftUI修饰符顺序很重要?

    每当我们将修饰符应用于SwiftUI视图,我们实际上都会创建一个应用了更改的新视图——我们不仅会修改现有的视图。...如果思考一下修饰符的工作原理,您就可以了解为什么会如此:每个修饰符都会创建一个应用了该修饰符的新结构体,而不是视图上设置属性。 您可以通过查询视图主体的类型来窥视SwiftUI的底层。...(width: 200, height: 200) .background(Color.red) 现在最好的思考方法是,想象一下SwiftUI每个修饰符之后都会呈现您的视图。...如果您之后再扩展Frame,它将不会神奇地已经应用了的背景。 使用修饰符的一个重要副作用是,我们可以多次应用相同的效果:每个修饰符都会简单地添加到以前的内容。...例如,SwiftUI为我们提供了padding()修饰符,该修饰符视图周围添加了一些空间,从而不会将其推到其他视图或屏幕边缘。

    2.4K10

    ObservableObject研究

    State(状态集合)任何的单一元素发生变化都将通知所有与Store有依赖的View进行。 我就以上几点逐条进行分析。...SwiftUI程序编译便已将所有的View编译成View树,它尽可能的只对必须要响应状态变化的View(@State完美的支持)进行工作。...用户还可以通过自行设置Equatable的比对条件进一步优化View策略。...依赖通知接口唯一性 State(状态集合)任何的单一元素的变化都将通知所有与Store有依赖的View进行。 使用@Published对State进行了包装。...尤其State本来很多数据的变化性是不高的,大量的View只需要使用变化性低的数据,但只要State发生任何改动,都将被迫。 如何改善 发现了上述的问题后,开始逐步尝试找寻解决的途径。

    2.4K60

    SwiftUI 动画进阶 — Part 5:Canvas

    一个简单的 Canvas 简而言之,画布Canvas 是一个 SwiftUI 视图,它从一个渲染闭包获得绘制指令。与 SwiftUI API 的大多数闭包不同,它不是一个视图生成器。...Canvas 视图有一种引用 SwiftUI 视图的方式,将其解析为一个符号,然后绘制它。 要解决的视图ViewBuilder闭包传递的,如下面的例子所示。...你猜怎么着,画布会不断地它以保持动画效果。...为了进一步提高性能,你应该考虑Canvas是否有一些部分不需要不断我们的例子,只有时钟指针移动,其他部分保持静止。因此,明智的做法是把它分成两个重叠的画布。...每一列都被实现为一个单独的SwiftUI视图。叠加字符和用渐变绘图是由视图处理的。当我们画布上使用渐变,起始/结束点或任何其他几何参数都是相对于整个画布的。

    2.7K10

    肘子的 Swift 周报 #015 | 新框架、新思维

    ,用于表现着色器(Shader),后者 3D 场景渲染过程担当关键角色,专门执行着色计算,并主要运行在 GPU 上。...文章详尽地阐述了如何从 ObservableObject 和@Published 平稳过渡到@Observable 的方法,并着重讨论了采用@Observable 带来的优势,尤其是管理多个视图模型属性...,对于减少 SwiftUI 的显著改进。...作者 Antoine van der Lee 强调,采纳这种新宏能有效避免 SwiftUI 视图的不必要,对于提升整体应用性能至关重要。...文章详细总结了 Git 合并和分支的日常操作,并强调了掌握不同合并技巧的重要性。Wals 提醒读者,处理合并冲突保持冷静和耐心至关重要,并建议需要寻求同事的帮助。

    13310

    SwiftUI-数据流

    SwiftUI的界面是严格数据驱动的:运行时界面的修改,只能通过修改数据来间接完成,而不是直接对界面进行修改操作。...数据处理的基本原则 Data Access as a Dependency: SwiftUI 数据一旦被使用就会成为视图的依赖,也就是说当数据发生变化了,视图展示也会跟随变化,不会像 MVC 模式下那样要不停的同步数据和视图之间的状态变化...A Single Source Of Truth: 保持单一数据源, SwiftUI 不同视图之间如果要访问同样的数据,不需要各自持有数据,直接共用一个数据源即可,这样做的好处是无需手动处理视图和数据的同步...数据流图 从上图可以看出SwiftUI 的数据流转过程: 用户对界面进行操作,产生一个操作行为 action 该行为触发数据状态的改变 数据状态的变化会触发视图 SwiftUI 内部按需更新视图,...最终再次呈现给用户,等待下次界面操作 注意 SwiftUI ,开发者只需要构建一个视图可依赖的数据源,保持数据的单向有序流转即可,其他数据和视图的状态同步问题 SwiftUI 帮你管理,所以 ViewController

    10.1K20

    干货 | 关于SwiftUI,看这一篇就够了

    SwiftUI的作用。...也就是说,声明一个属性SwiftUI会将当前属性的状态与对应视图的绑定,当属性的状态发生改变的时候,当前视图会销毁以前的状态并及时更新,下面具体分析一下这个过程。...@State内部是Get的时候建立数据源与视图的关系,并且返回当前的数据引用,使视图能够获取,Set方法中会监听数据发生变化、会通知SwiftUI重新获取视图body,再通过Function Builders...用户交互过程,会产生一个用户的action,从上图可以看出,SwiftUI数据的流转过程如下: 该行为触发数据改变,并通过@State数据源进行包装; @State检测到数据变化,触发视图;...因为, SwiftUI这些属性的设置在内部都会用一个View来承载,然后布局的时候就会按照上面示例的布局流程,一层层View的计算布局下来,这样做的优点是:方便底层设计渲染函数更容易做到monomorphic

    7.5K11

    百行代码变十行,苹果SwiftUI可视化编程让开发者惊呼完美

    而对于开发者来说,新发布的 SwiftUI 可能是最吸引人的特性, Craig Federighi 的演示,我们可以轻松地把一百行的前端代码缩减到十几行。...只需一次就能定义布局 开发者只需定义视图(view)内容和布局,SwiftUI 懂得什么时候需要改变,并可以随时更新(视图)以匹配设计。 ?...当我们设计面板,我们编辑的所有内容都与左边编辑器的代码完全同步。当我们修改预览(preview),对应代码可实时生成,也就是说我们对预览修改的内容能实时体现在代码。...Xcode 会立即重新编译你的修改,并将它们插入到 APP 的运行。因此整个开发,预览可视化与代码可编辑性能同时支持并交互。 ?...Xcode 会通过「动态替换」实时 APP 交换编辑的代码,这是 Swift 的新特征。

    4.1K10

    如何在 SwiftUI 熟练使用 sensoryFeedback 修饰符

    = nil { generator.selectionChanged() } } }} iOS 17 ,Apple 直接向 SwiftUI 添加了一系列感觉反馈的视图修饰符...,impact反馈有两个变体,让您指定元素碰撞的重量(轻,)或灵活性(刚性,柔软,实心)。...根据触发器值选择样式sensoryFeedback 视图修饰符的另一种变体允许我们根据触发器值选择特定的反馈样式。在这里,我们存储包含结果播放成功反馈,并在结果为空播放错误反馈。...闭包,返回一个布尔值,指示是否应播放反馈。使用反馈闭包触发要控制播放何种反馈,请使用视图修饰符的反馈闭包版本。...总结SwiftUI引入了新的sensoryFeedback视图修饰符,为所有Apple平台提供触觉反馈。通过简单的附加,我们可以定义反馈样式和触发器值,实现了应用程序不同操作产生的触觉效果。

    12621

    SwiftUI 与 Core Data —— 数据获取

    遗憾的,NSFetchedResultsController 为 UITableView 准备的基于 NSFetchRequestResultType 优化操作 SwiftUI 并不起作用。...当 SwiftUI 视图存续期中重新创建视图描述实例,自定义类型也将一并重新创建在视图存续期中,如果 SwiftUI 创新创建了视图描述实例,那么无论视图描述( 符合 View 协议的 Struct...不可在 update 方法同步地改变引发视图更新的数据与 SwiftUI 视图中更新 Source of truth 的逻辑一致,一个视图更新周期中,不能对 Source of truth 再度更新...image-20221203183414864当应用运行于托管环境,仅需提供正确的视图上下文,并将 dataSource 的属性值修改成 fetchRequest 即可。... MockableFetchRequest ,无需声明时提供 NSFetchRequest,可以视图加载,动态地为 MockableFetchRequest 提供所需的 NSFetchRequest

    4.6K30

    老人新兵 —— 一款 iOS APP 的开发手记

    比如像我的 app 这样只 iOS 上运行的话,只需要最小的代码开销便可完成非常优秀的云同步。...模拟器 NavigationLink 只能使用一次,第二次点会失效,实机没有问题。很难实现直接返回到根视图,通过 dissmiss 只能返回到上层视图。...如果有 animation 的话,数据多时效率会很低,使用 id 强制可以解决。VStack HStack ZStack版式控制很方便,可以短时间内就完成较复杂的版式构图。...平时的程序运行完全不依赖于该属性,导出 JSON 则依赖这些属性来标注他们之间的 relationship.托管上下文中,数据的执行效率很高。...@FetchRequest 对数据的动态管理非常好, SwiftUI 数据的任何变化都能动态体现。

    2.5K40

    避免 SwiftUI 视图的重复计算

    SwiftUI视图加载到视图,通过调用 _makeProperty 完成将数据保存到托管数据池以及属性图中创建关联的操作,并将数据托管数据池中的引用保存在 _location ( AnyLocation...并且 SwiftUI 会在其变化时自动更新( 重新计算 )对应的视图SwiftUI 上有一个困扰了不少人的问题:为什么无法视图的构造函数,更改 State 包装的变量值?...of Truth( 符合 DynamicProperty 协议的属性包装器 ),只要在视图类型声明了,无论是否视图 body 中被使用,它给出刷新信号,当前视图都将被刷新。...与符合 DynamicProperty 协议的属性包装器主动驱动视图更新的机制不同,SwiftUI 更新视图,会通过检查子视图的实例是否发生变化( 绝大多数都由构造参数值的变化导致 )来决定对子视图更新与否...会在主线程上运行触发器闭包,如果闭包的操作比较昂贵,可以考虑将闭包发送到后台队列 总结 本文介绍了一些 SwiftUI 如何避免造成视图重复计算的技巧,除了从中查找是否有能解决你当前问题的方法外

    9.2K81
    领券