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

为什么这个SwiftUI会查看init两次?

SwiftUI 会查看 init 两次的原因是因为它的设计理念和生命周期特性。

SwiftUI 是一种声明式的 UI 框架,它使用了一种叫做 "Reactive Programming" 的编程范式,其中 UI 的状态会自动反映并响应数据的变化。为了实现这种响应式更新机制,SwiftUI 引入了 "State" 和 "Binding" 概念。

在 SwiftUI 中,当某个视图的状态发生变化时,SwiftUI 会使用新的状态重新构建视图,这是通过调用视图的 init 方法来实现的。但是在构建新的视图之前,SwiftUI 会先检查旧的视图和新的视图是否相同,以便判断是否需要重新构建。这个检查过程是通过再次调用 init 方法来完成的。

因此,在 SwiftUI 中,一个视图会被初始化两次的情况是很常见的。第一次初始化用于创建旧视图,第二次初始化用于创建新视图。这个过程是自动进行的,开发者无需手动干预。

这种设计和生命周期特性使得 SwiftUI 具有高效的 UI 更新能力,并且能够自动处理数据的变化。通过使用 SwiftUI,开发者可以更加专注于 UI 的设计和逻辑实现,而无需过多关注底层的 UI 更新和状态管理细节。

相关链接:

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

相关·内容

为什么JSON.parse损坏大数字,如何解决这个问题?

直到现在,我们也没能解决这个问题。在这篇文章中,我们深入解释了这个问题,并展示如何在JSON Editor Online中解决这个问题。 大数字的问题 大多数 Web 应用程序处理来自服务器的数据。...为什么大数字会被JSON.parse破坏? 像 9123372036854000123 这样的长数字既是有效的 JSON 也是有效的 JavaScript。...在这种情况下,最后三位数字丢失,破坏了该值。...例如,1e+500变成Infinity,而1e-500变成0。不过,这些限制在实际应用程序中很少成为问题。 如何防止数字被 JSON.parse 破坏?...即使没有第三方库的参与,与BigInt值一起工作也导致棘手的问题。当对大整数和普通数字的混合操作时,JavaScript可以默默地将一种数字类型强制转化为另一种,这可能导致错误。

2.7K20
  • SwiftUI中使用UIKit视图

    在makeUIVIew执行后,updateUIVew必然执行一次•dismantleUIView在UIViewRepresentable视图被移出视图树之前,SwiftUI会调用dismantleUIView...在绘制屏幕时,从视图树的顶端开始对视图的body求值,如果其中还包含子视图则将递归求值,直到获得最终的结果。...•处理UIKit视图中的复杂逻辑在UIKit开发中,通常会将业务逻辑放置在UIViewController中,SwiftUI没有Controller这个概念,视图仅是状态的呈现。...image-20210823091321562 查看源代码 避免滥用UIKit包装 尽管在SwiftUI中使用UIKit或AppKit并不麻烦,但是当你打算包装一个UIKit控件时(尤其是已有SwiftUI...我个人更倾向于使用组合的方案。 SwiftUI中很多数据类型官方并不提供转换到其他框架类型的方案。比如Color、Font。不过这两个多写点代码还是可以转换的。

    8.2K22

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

    也许有人感到困惑,为什么使用 Observation 框架声明的可观察对象的注入方式与值类型类似,而遵守 ObservableObject 协议的引用类型,都需要使用注明了 Object 的方法才能注入...我们可以通过查看其 源代码[3] 来了解更多信息。...SwiftUI 的视图如何观察属性的变化 根据 Observation 框架的工作原理,我们可以推测 SwiftUI 大概采用下面的方法在可观察属性与视图更新之间创建联系: struct A:View...我们需要更多时间来评估这是否导致新的性能问题。 Observation 框架影响 SwiftUI 编程习惯吗 对我来说,是的。...随着越来越多的 SwiftUI 应用转换到这个框架上,开发者总结出更多的使用心得。

    57620

    解析SwiftUI布局细节(一)

    3、把它们进行一个组装,处理相应的各种代理或者事件回调等等 4、处理数据和视图进行数据对接 可能我们大部分都是这样的一个基本的流程,当然还有些涉及到复杂点的业务我们从单元测试开始等等的会有些许差异...@inlinable public init(alignment: HorizontalAlignment = .center, spacing: CGFloat?...还有上面我们调用的时候为什么要写成列的形式,能不能写成"1" "2" "3" "4" 这种形式呢?肯定是不行的,这个你也可以自己尝试一下。.../ 定义一个常见的背景View struct Background: View { private var content: Content init..., to: nil, from: nil, for: nil) } } /// 具体的使用就是下面这样,这样就达到了我们的目的,中间的代码我隐藏起来了,代码在BaseLoginView中可以查看

    2.4K10

    ViewBuilder 研究(上)—— 掌握 Result builders

    SwiftUI 视图容易在 Xcode 上卡死或出现编译超时 为什么会出现 “Extra arguments” 的错误提示(仅能在同一层次放置有限数量的视图) 为什么要谨慎使用 AnyView 如何避免使用...AnyView 为什么无论显示与否,视图都会包含所有选择分支的类型信息 为什么绝大多数的官方视图类型的 body 都是 Never ViewModifier 同特定视图类型的 modifier 之间的区别...或许大家奇怪, buildEither 的实现如此简单,并没有太大的意义。在 result builders 提案过程中也有不少人有这个疑问。其实 Swift 的这种设计有其相当合适的应用领域。...不过当前的实现仍无法为我们提供创建例如 SwiftUI 各种容器的可能性,这个问题将在范例二中得以解决。...在 SwiftUI 中,内层的设定应优先于外层的设定。为了解决这个问题,我们需要对 AttributedString 的 modifier 做一些修改。

    3.1K20

    从用SwiftUI搭建项目说起

    SwiftUI的理解,这个过程当中正好把整个学习过程记录下来,方便自己查阅,也希望能给需要的同学一点点的帮助。...这两张图相信看过苹果官方SwiftUI介绍文档并且跟着写了一遍代码的同学应该不陌生,当然我们的目的不是说这两篇的代码,这个具体的可以到下面连接去查看,我自己跟着写了一遍之后对SwiftUI也是有了一个基本的认识...我们在后面遇到的一些问题也回到这个官方文档进行一些验证。...搭建这样一个场景构建一个基本的应用,包括登录和数据处理以及iOS常见控件在SwiftUI中的一些具体的使用,这个项目随着学习进度慢慢的把所有的内容都基本的补齐,下面是最基本的导航+标签的git效果。...当 @State 装饰过的属性发生了变化,SwiftUI 根据新的属性值重新创建视图 */ @State private var selectedTab = 0 var

    4.5K20

    onAppear 的调用时机

    image-20230328163706115 请忽略例子中的写法是否合理和值得推荐,仅考虑为什么在第一段代码中,出现了数组越界的情况;以及第二段代码可以正确运行。...在一个视图的生存期中,SwiftUI 可能多次创建视图实例。 由于惰性视图的优化机制,对于尚未处于可见区域的子视图,SwiftUI 不会创建其实例 求值 一个被显示的视图至少会经历一次的过程。...当视图的依赖( Source of truth )发生变化后,SwiftUI 重新计算视图结果值,并与旧值进行比较。如发生变化,则用新值替换旧值。...但在 SwiftUI 中,onAppear 实际上是在渲染前被调用的。 假设排除了苹果起名出现了错误这个原因,此时的 appear 更像是针对 SwiftUI 系统来说的。...subviews _: Subviews, cache _: inout ()) -> CGSize { print("\(name) layout") return .init

    1.1K10

    onAppear 的调用时机

    图片请忽略例子中的写法是否合理和值得推荐,仅考虑为什么在第一段代码中,出现了数组越界的情况;以及第二段代码可以正确运行。...在一个视图的生存期中,SwiftUI 可能多次创建视图实例。由于惰性视图的优化机制,对于尚未处于可见区域的子视图,SwiftUI 不会创建其实例求值一个被显示的视图至少会经历一次的过程。...当视图的依赖( Source of truth )发生变化后,SwiftUI 重新计算视图结果值,并与旧值进行比较。如发生变化,则用新值替换旧值。...但在 SwiftUI 中,onAppear 实际上是在渲染前被调用的。假设排除了苹果起名出现了错误这个原因,此时的 appear 更像是针对 SwiftUI 系统来说的。...subviews _: Subviews, cache _: inout ()) -> CGSize { print("\(name) layout") return .init

    2.1K20

    避免 SwiftUI 视图的重复计算

    符合 DynamicProperty 协议的属性包装器 几乎每一个 SwiftUI 的使用者,在学习 SwiftUI 的第一天就会接触到例如 @State、@Binding 这些引发视图更新的属性包装器...// SwiftUI 托管数据池中的数据引用 public init(wrappedValue value: Value) public init(initialValue value: Value...当 SwiftUI 将视图从视图树上删除时,一并完成对 SwiftUI 数据池以及关联的清理工作。如此,使用 State 包装的变量,其存续期将与视图的存续期保持完全一致。...并且 SwiftUI 会在其变化时自动更新( 重新计算 )对应的视图。 SwiftUI 上有一个困扰了不少人的问题:为什么无法在视图的构造函数中,更改 State 包装的变量值?...为了解决这个问题,我们应该调整传递给子视图的参数类型和内容,仅传递子视图需要的数据。

    9.3K81

    只在视图 Body 中生存的变量

    SwiftUI 通过调用视图实例的 body 属性来获取视图值。...场景一 前几天在 聊天室中有这个一个讨论: image-20230321195140004 由于 @FetchRequest 的返回类型 FetchedResults 并不支持索引,因此为了给每个对象添加一个序号...为什么和想象的不一样!起始点不是 0 ? 同我们不要去推断在一个视图的存续期内,SwiftUI 创建多少个该视图的实例一样,我们也不应假设,在渲染第一行数据之前,body 没有被调用过。...在 SwiftUI 所有的惰性容器中,都会出现计算两次的情况( 或许与惰性容器的视图值保存机制有关 ),这就要求我们为了得到正确的 offset 值必须进行除 2 的操作。...@State + onAppear 也能实现类似的效果,不过让视图多刷新一次。如果计算时间真的较长( 导致视图停滞 ),通过在 task 中使用异步方法才是更好的选择。

    68810

    SwiftUI 布局 —— 尺寸( 上 )

    20.33 ) ZStack 将 Text 放置在了 152.33, 418.33 处,并为其提供了渲染尺寸( 85.33 x 20.33 ) 布局过程基本上分为两个阶段: 第一阶段 —— 讨价还价 在这个阶段...讨价还价的次数与视图结构的复杂度成正比,整个的协商过程可能反复出现多次甚至推倒重来的情况。 容器与视图 在阅读 SwiftUI 布局系列文章时,大家可能会对其中某些称谓产生困惑。...对于不包含子视图的视图来说( 例如 Text 这类的元视图 ),它们同样提供接口供父视图来调用以向其传递建议尺寸并获取其需求尺寸。...中,父视图根据它的需求选择合适的建议模式提供给子视图。...以两个维度为同一种模式举例: 最小化模式 需求尺寸为 0 x 0 最大化模式 需求尺寸为 infinity * infinity 明确尺寸模式 需求尺寸为建议尺寸 未指定模式 需求尺寸为 10 x 10( 至于为什么

    4.8K20
    领券