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

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

只有这些变量重构视图模型中去这一种方式?A:如果在同一个视图中,有多个相互关联 @State 属性,将他们提取到一个结构或许是好选择。...比如说我可以在级视图中拥有 StateObject,并通过 EnvironmentObject 传递对象。然而,如果里面的 @Published 属性改变了,视图和它子树也都被重新计算。...对于苹果工程师给予建议有一点请注意,那就是如果有在视图中修改该环境对象实例需求,须确保视图不会被反复重构( SwiftUI 重新创建视图类型实例 )。...事实上,这些视图( 惰性容器视图 )一旦被创建,其存续期持续惰性容器被销毁为止。请阅读 SwiftUI 视图生命周期研究[12] 了解更多内容。...我在同一个子上下文中创建一个新托管对象,并希望这个对象发送到一个新窗口。

12.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    SwiftUI 状态管理系统指南

    前言 SwiftUI与苹果之前UI框架区别不仅仅在于如何定义视图和其他UI组件,还在于如何在整个使用它应用程序管理视图层级状态。...SwiftUI没有使用委托、数据源或任何其他在UIKit和AppKit等命令式框架中常见状态管理模式,而是配备了一些属性包装器[1],使我们能够准确地声明我们数据如何被我们视图观察、渲染和改变。...观察和修改环境变量 最后,让我们来看看SwiftUI环境系统如何被用来在两个互不直接连接视图之间传递各种状态。...尽管在一个视图和它一个子视图之间创建绑定通常很容易,但在整个视图层次结构传递某个对象或值可能相当麻烦——而这正是环境变量旨在解决问题类型。 有两种主要方法来使用SwiftUI环境。...小结 SwiftUI管理状态方式绝对是该框架最有趣方面之一,它可能需要我们稍微重新思考数据在应用传递方式——至少在涉及将被我们UI直接消费和修改数据时是这样。

    5.1K20

    GeometryReader :好东西还是坏东西?

    ( Required Size )返回给视图 视图建议尺寸作为自身建议尺寸传递给子视图 子视图原点(0,0)置于 GeometryReader 原点位置 其理想尺寸( Ideal Size...另外,在某些情况下,GeometryReader 有可能返回尺寸为负数数据。如果直接这些负数数据传递给 frame,就可能会出现布局异常(在调试状态下,Xcode 会用紫色提示警告开发者)。...因为在某些系统版本,从 background 传递数据无法被 onPreferenceChange 获取到。...作为一个视图,GeometryReader 只能在被评估、布局和渲染后,才能将获取数据传递给闭包代码。...不过,大家是否想过,其实在很多场景,GeometryReader 本来就并非最优解。与其说避免使用,不如说用更加 SwiftUI 方式来进行布局。

    62770

    SwiftUI中使用UIKit视图

    例如,UIKit我们一个代理对象附加到Text field视图上,当用户输入时,当用户按下return键时,该代理对象对应方法将被调用。...在协调器,我们可以通过双向绑定(Binding),通知中心(notificationCenter)或其他例如Redux模式单项数据流等方式UIKit视图内部状态报告给SwiftUI框架或其他需要模块...因此我们需要创建协调器,并在协调器实现该方法,录入内容传递给Demo视图中name变量。...考虑尽量不将例程复杂化,我们使用UIColor、UIFont作为配置类型。SwiftUIColor和Font转换成UIKit版本增加不小代码量。...不过有以下几点需要注意: •如何改变View内值(View是结构)•如何处理返回类型(保证调用链继续有效)•如何利用SwiftUI框架现有的数据并与之交互逻辑 为了更全面的演示,下面的例子,采用了不同处理方式

    8.2K22

    SwiftUI数据流之State&Binding

    SwiftUI,以单一数据源(single source of truth)为核心,构建了数据驱动状态更新机制。...还记得我们如何使用mutating关键字来修改结构方法属性吗?...@Binding作用是在保存状态属性和更改数据视图之间创建双向连接,当前属性连接到存储在别处单一数据源(single source of truth),而不是直接存储数据。...通常使用场景是把当前View@State值类型传递给其子View,如果直接传递@State值类型,将会把值类型复制一份copy,那么如果子View对值类型某个属性进行修改,View不会得到变化...,为了简化内容说明核心问题,只有两行内容,视图是ProductsView,其中嵌套着子视图FilterView和列表元素,为了能够使得FilterView对showFavorited修改能够传递视图

    4.1K30

    SwiftUI 布局工作原理

    SwiftUI 布局简介 ---- 在这个技术项目中,我们探讨 SwiftUI 如何处理布局。...有些事情已经解释过了,有些可能是你自己弄明白,但更多是你在这一点上想当然事情,所以我希望一个详细探索能真正为 SwiftUI 工作方式提供一些启示。...在此过程,您还将学习如何创建更高级布局对齐,使用GeometryReader构建特殊效果,以及更多——我知道您会热衷于在自己应用程序中部署一些真正强大功能。...SwiftUI 布局工作原理 ---- 所有的 SwiftUI 布局都有三个简单步骤,理解这些步骤是每次获得优秀布局关键。步骤如下: 视图提供一个大小并询问其子视图大小。...这在以前可能会令人困惑,但一旦 Frame 视为图像对象,这就完全有意义了: ContentView 提供了整个屏幕。 frame 报告它想要300x300。

    3.8K20

    Vue 如何函数作为 props 传递给组件

    可以字符串、数组、数字和对象作为props传递。但是你能把一个函数当作一个props来传递吗? 虽然可以函数作为props传递,但这种方式不好。...因此,尽管在Vue可以把函数作为prop传递,但它被认为是一种反模式。 使用事件 事件是我们与 Vue 组件通信方式。 这里有一个简短例子来说明事件是如何工作。...强烈建议查看官方Vue文档来了解更多关信息,绝对值得一读。 但是事件并不能完全解决我们所有的问题。 从子组件访问组件作用域里数据 在许多情况下,我们试图解决问题是访问来自不同作用域数据。...从父类获取值 如果希望子组件访问组件方法,那么方法直接作为 prop 传递似乎简单明了。 在组件我们会这样做: <!...这是达到同样效果更好方法。 在其他情况下,我们可能想要从子元素获取一个值元素,我们为此使用了函数。 例如,你可能正在这样做。函数接受子函数值并对其进行处理: <!

    8.1K20

    :第九章 - 组件基础再探(data、props)

    这时候,我们当然就可以获取到这个值了,因此,组件 props 经常用于将我们组件值传递子组件或是 Vue 实例属性值传递组件中使用。   ...在组件/Vue实例引用子组件时候,通过属性绑定方式(v-bind),需要传递给子组件数据进行传递,从而在子组件内部,通过绑定属性值获取到组件/Vue实例数据。   ...这样会防止从子组件意外改变级组件状态,从而导致你应用数据流向难以理解。...三、总结   本章,主要是介绍了我们如何在组件中使用 data 选项和 props 选项,以及在使用过程中一些与 Vue 实例中使用方式不同地方,同时,介绍了如何组件属性值传递子组件。...既然组件可以属性值传递子组件,毫无疑问,我们也可以子组件属性传递组件,父子组件之间进行属性传递方式,我放在下一章中进行介绍。

    82530

    SwiftUI 布局 —— 对齐

    可以在此处下载 本文所需源代码[3] 什么是对齐( Alignment ) 对齐是发生在多个对象之间一种行为。比如书桌上一摞书摆放整齐,列队训练时向左(右)看齐等等。...在 SwiftUI ,对齐是指在布局容器多个视图按照对齐指南( Alignment Guide )进行对齐。...VStack、HStack、ZStack 等支持多视图布局容器 你是否了解 SwiftUI 常用布局容器构造方法对齐参数含义?它们又是如何实现呢?...因为在布局容器构造方法设定对齐指南只用于容器子视图之间。 为了更好地理解之所以描述二才是正确,我们需要对 SwiftUI 布局原理以及 ZStack 处理方式有所了解。...主视图和附加视图按照设定对齐指南进行对齐。

    6.4K20

    使用 React 与 Vue 创建同一款 App,差别究竟有多大?

    因此,初始数据传递组件方式非常相似。但正如我们提到那样,在两个框架更改数据方式有所不同。 假设我们有一个名为 name: ‘Sunil’ 数据元素。...,我们 props 传递子组件创建处。...Vue 实现方法 在 Vue ,我们 props 传递子组件创建处方式如下: <ToDoItem v-for="todo in list" :todo="todo"...然后可以在子组件通过名字引用它们。 如何数据发送回组件 React 实现方法 我们首先将函数传递给子组件,方法是在我们调用子组件时将其引用为 prop。...总结 我们研究了添加、删除和更改数据,以 prop 形式从父组件子组件传递数据,以及通过事件监听器形式数据从子组件发送到组件。

    5.3K10

    【Vue】Vue父子组件通讯以及使用sync同步父子组件数据

    子组件向组件传递数据 主要谈谈2情景实现,有三种方式: 一....[子组件ref].[子组件属性/方法]这种方式直接取得子组件数据 下面我一 一展示 一....通过sync实现数据双向绑定, 从而同步父子组件数据 通过以上三种方式, 我想你应该能解决绝大多数父子组件通信场景了,但让我们再仔细考虑一下上面的通信场景,就会发现它们还可能存在问题: 从子组件向组件传递数据时..., 这增加了分析数据难度 当sync修饰prop是个对象 我们对上面的例子修改一下, 把数据包裹在一个对象传递下来: 组件 ...组件数据传递给子组件, 一般通过props实现, 而在实现“父子组件数据同步”这一需求时候, 小伙伴们可能会发现一点: 在子组件修改引用类型props(如数组和对象)是可行 1.不仅可以达到同时修改组件数据

    4.6K110

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

    本文介绍 geometryGroup() 概念、用法,以及在低版本 SwiftUI ,在不使用 geometryGroup() 情况下如何处理异常。...默认情况下,SwiftUI 视图会将位置和大小变化沿视图层级向下传递,以至于只有绘制内容视图(称为叶子视图)当前动画应用到它们框架矩形上。...当 toggle 状态发生改变时,红色矩形按照预期以动画方式进行了缩放。黄色圆形最终也出现在红色矩形放大后左上角位置。然而,这是否符合我们预期效果呢?...以上面的示例来说,在添加了 geometryGroup() 后,视图( frame )并不是一次性将自身几何属性改变状态传递给了子视图,而是这些变化动画化了后,持续传递给子视图。...由此可见,geometryGroup() Group 含义为视图统一处理并动画化其几何属性变化后,再传递给子视图。子视图不再各自独立处理上述信息。

    28710

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

    在这篇文章,我们探讨几个在 SwiftUI 开发中经常使用且至关重要属性包装器。本文旨在提供对这些属性包装器主要功能和使用注意事项概述,而非详尽使用指南。...在复杂视图层级,逐级传递 @Binding 可能导致数据流难以追踪,此时应考虑使用其他状态管理方法。 确保 @Binding 数据源是可信,错误数据源可能导致数据不一致或应用崩溃。...它提供了一种便捷方式在不同视图层级引入共享数据,而无需显式地通过每个视图构造器传递。 典型应用场景 当需要在多个视图间共享同一个数据模型时,如用户设置、主题或应用状态。...,与 EnvironmentKey 类似的定义方式用途很多,掌握了一种很容易掌握其他。...比如:PreferenceKey( 子视图传递视图 )、FocusedValueKey( 基于焦点传递值 )、LayoutValueKey( 子视图传递给布局容器 )。

    32310

    SwiftUI:使用 @EnvironmentObject 从环境读取自定义值

    但是我们也可以将自定义对象发送到环境,并在以后将它们读出来,这使我们可以在复杂应用程序更轻松地共享数据。...您已经了解了如何使用@State处理单个视图局部状态,以及@ObservedObject如何使我们在视图之间传递一个对象,以便我们可以共享它。...如果我们使用@ObservedObject,则需要将我们对象从每个视图传递下一个视图,直到它最终到达可以使用该视图视图E,这很烦人,因为B,C和D不在乎它。...好,让我们看一些代码,这些代码展示了如何使用环境对象在两个视图之间共享数据。...好吧,您已经了解字典如何让我们使用一种类型作为键key,而另一种类型作为值。环境有效地使我们可以数据类型本身用作键,并将类型实例用作值。

    9.7K20

    如何在Xcode下预览含有Core Data元素SwiftUI视图

    结合两年来我在SwiftUI中使用Core Data经验和教训,我们将在本文中探讨: •导致SwiftUI预览崩溃部分原因•如何在之后开发避免类似的崩溃出现•如何在Xcode安全可靠地预览含有...其中通过环境值(EnvironmentValue)或环境对象(EnvironmentObject)传递数据是其中使用量较大两种方式。...为SwiftUI预览提供Core Data数据 本节,我们介绍几种为预览组织Core Data数据方式,提高SwiftUI+Core Data开发效率。...SwiftUI通常采用Redux开发模式,通过获取到Core Data数据转换成标准Swift结构从而避免在视图中使用托管对象上下文或托管对象。...直接使用托管对象 当然,我们仍然可以直接给视图传递托管对象。为了便于在预览重复使用,我们可以在CoreDataStack或其他你认为合适地方提前创建好用于预览数据,在预览时直接调用即可。

    5.1K10

    SwiftUI 布局协议 - Part 1

    简介 今年 SwiftUI 新增最好功能之一必须是布局协议。它不但让我们参与布局过程,而且也给了我们一个很好机会去更好理解布局在 SwiftUI 作用。...早在2019年,我写了一篇文章SwiftUI frame 表现[1],其中,我阐述了视图和子视图如何协调形成最终视图效果。那里描述许多情况需要通过观察不同测试结果去猜测。...就像我在以前文章 SwiftUI frame 表现 所描述那样,在布局过程视图给子视图提供一个尺寸,但最终还是由子视图决定如何绘制自己。然后,它将此传达给视图,以便采取相应动作。...无论如何,在没有缓存情况下编写我们布局更简单一点,当我们以后需要时再添加。SwiftUI 已经做了一些缓存。例如,从子视图代理获得值会自动存储在缓存。相同参数反复调用将会使用缓存结果。...例如,这里是使用更新缓存 SimpleHStack 。下面是我们需要做: 创建一个包含缓存数据类型。在本例,我把它叫做 CacheData ,它将会计算视图间最大高度和空间。

    3.3K10

    SwiftUI 布局 —— 尺寸( 上 )

    但由于 SwiftUI 视图并没有提供尺寸这一属性,因此即使在 SwiftUI 诞生了数年后今天,如何获取视图尺寸仍然是网络上热门问题。...淡化尺寸概念初衷或许是出于以下两点: 引导开发者转型声明式编程逻辑,转变使用精准尺寸习惯 掩盖 SwiftUI 复杂尺寸概念,减少初学者困扰 但无论如何淡化或掩盖,当涉及更加高级、复杂、精准布局时...对于不包含子视图视图来说( 例如 Text 这类元视图 ),它们同样会提供接口供视图来调用以向其传递建议尺寸并获取其需求尺寸。...虽然当前 SwiftUI 绝大多数视图并不遵循 Layout 协议,但从 SwiftUI 诞生之始,其布局系统便是按照 Layout 协议提供流程进行布局操作,Layout 协议仅是内部实现过程包装成开发者可以调用接口...本节结合 SwiftUI 4.0 Layout 协议对布局过程涉及尺寸做更详细介绍。

    4.8K20

    StateObject 与 ObservedObject

    视图加载到视图树时,SwiftUI 会根据当时采用实例需要绑定状态( @State、@StateObject、onReceive 等 )托管到 SwiftUI 托管数据池中,之后无论实例再被创建多少次...Property Wrappers )在管理属性存储方式代码和定义属性代码之间添加了一层分离。...在 SwiftUI 视图添加到视图树上时,调用 _makeProperty 方法需要持有的订阅关系、强引用等信息保存到 SwiftUI 内部数据池中。...例如,在某些情况下,开发者需要视图不断地生成全新可观察对象实例传递给子视图。但由于子视图中使用了 StateObject ,它只会保留首次传入实例强引用,后面传入实例都将被忽略。...不在它构造方法引入无关操作可以极大地减轻系统负担。对于数据准备工作,可以使用 onAppear 或 task ,在视图加载时进行。

    2.4K20
    领券