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

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

原文发表在我的博客 肘子的Swift记事本视图变化在前、状态变化在后在 SwiftUI 中,某些可编程控件在执行一定的操作时,会先更新视图,待视图变化完成后再修改与其对应的状态。...而通过调用环境值或直接修改绑定状态,SwiftUI 则遵循了响应式编程原则,进行了的先调整状态,后更新视图的操作。...,确保用户只能在 showSheet 为否时通过滑动返回到上一层视图。...如果我们认为问题出在这里,就需要使用编程式导航的方式来调整代码。为了不影响用户的使用习惯,我们禁用了 NavigationStack 自带的 Back 按钮。...幸运的是,我 @KyleSwifter 的 解密 SwiftUI 背后的 AttributeGraph 一文中找到了线索。

603110

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

视图变化在前、状态变化在后 在 SwiftUI 中,某些可编程控件在执行一定的操作时,会先更新视图,待视图变化完成后再修改与其对应的状态。这些控件基本上都是对 UIkit(AppKit)的二次包装。...而通过调用环境值或直接修改绑定状态,SwiftUI 则遵循了响应式编程原则,进行了的先调整状态,后更新视图的操作。...,确保用户只能在 showSheet 为否时通过滑动返回到上一层视图。...如果我们认为问题出在这里,就需要使用编程式导航的方式来调整代码。 为了不影响用户的使用习惯,我们禁用了 NavigationStack 自带的 Back 按钮。...幸运的是,我 @KyleSwifter[4] 的 解密 SwiftUI 背后的 AttributeGraph[5] 一文中找到了线索。

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

SwiftUI 与 Core Data —— 数据定义

遗憾的是,托管对象对于值类型为主的 SwiftUI 来说并不算友好,因此,不少开发者都会在视图中将托管对象实例转换成一个结构体实例以方便接下来的操作( 如何在 Xcode 下预览含有 Core Data...元素的 SwiftUI 视图[4])。...因此,在传统的 Core Data 应用开发方式中,开发者为了创建上图中 Group Cell 视图,通常需要进行如下的步骤( Todo 应用中的 Task Group 举例 ):image-20221128130041823...面向协议编程面向协议编程是贯穿 Swift 语言的基本思想,也是其主要特点之一。通过让不同的类型遵守相同的协议,开发者便可以具体的类型中解放出来。...,我们则可以实现将所有的视图代码均托管环境中解放出来的愿望。

2.4K40

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

恰逢 博客[2] 的文章数达到了 100 篇,将其搬运回来提醒自己不忘初心。...习惯性地对信息行业的前沿动态以及一些新的技术方向保持着关注,但由于生意及其它方面的原因, 10 几年前便完全没有再接触过编程了。最近 6 — 7 年,由于疾病的原因,我的精力基本都集中在治疗上。...很难实现直接返回到视图,通过 dissmiss 只能返回到上层视图。在 Xcode 11 的 beta 版本中还可以采用一些非常规手段实现这一功能,不过目前已被屏蔽了。...ForEach视图声明中唯一的循环控制方式,控制力有待加强。如果使用 data: Range 的话,range 不可变。比如说 0.....SwiftUI 中的多数控件都是采用 bind 的方式来响应及传递数据,设计起来思路会很清晰,不过执行起来会有粘滞感。复杂 Sheet 会尤其明显。所有基于异步的设计响应都会有延时。

2.5K40

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

SwiftUI是一种新颖的构建UI方式和全新的编码风格,本文通俗易懂的语言,Swift 5.1语法新特性和SwiftUI的优势方面进行分享,希望对热爱移动端的同学有一定的帮助,让大家尽可能快速、全面和透彻地理解...本文主要从以下三个方面讲述SwiftUI的特性: 代码层面理解Swift 5.1新语法的底层实现; 数据流方面阐述SwiftUI的黑魔法; 布局原理层面阐述SwiftUI组件化的优势; 二、...通过这种编程模式,SwiftUI帮助开发者建立了各种视图和数据的连接,并且处理两者之间的关系,开发者仅需要关注业务逻辑,其官方的数据结构图如下: ?...作为SwiftUI的新特点之一,FunctionBuilder倾向于目前流行的编程方式,开发者能够使用基于DSL的架构,像SwiftUI,而不用去考虑具体的实现细节,因为构建器实现的就是一个DSL本身。...目前,组件化编程是主流的开发方式,SwfitUI带来了全新的功能--可以构建可重用的组件,采用了声明式编程思想。

5.8K10

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

Swift 的设计安全为出发点,以避免各种常见的编程错误类别。近年来,这种编程语言的热度上升很快,甚至有人呼吁用它来代替 Python,作为 TensorFlow 支持的语言。 ?...只需一次就能定义布局 开发者只需定义视图(view)中内容和布局,SwiftUI 懂得什么时候需要改变,并可以随时更新(视图匹配设计。 ?...单机打开检查器(inspector)选择字体、颜色、对齐方式和其它设计选项,我们也可以通过光标轻松重新排列控件。...这些视觉编辑器在代码编辑器中也能用,所以我们可以使用检查器挖掘每个控件的不同选项,即使在界面的手动编程部分也是一样的。我们可以库中拖拽控件,再放入到设计面板或代码面板都是可以的。...预览:现在,我们可以创建任何 SwiftUI 视图的一个或多个预览,从而得到样本数据,并配置几乎用户能看到的所有内容,例如大字体、定位或「暗黑模式」等。

4K10

SwiftUI:Alert弹窗

视图是我们程序状态的函数,Alert也不例外。因此,我们不用说“显示警报”,而是创建警报并设置显示警报的条件。...message: Text("This is some detail message"), dismissButton: .default(Text("OK"))) 如果需要,您可以添加更多代码更详细地配置按钮...更有趣的是我们如何显示警报:我们不将警报分配给变量,然后编写诸如myAlert.show()之类的东西,因为这将回到旧的“一系列事件”的思维方式。...SwiftUI将观察showingAlert,并在它变为true时立即显示警报。...如果要保存已编程的示例,则应将项目目录复制到其他位置。 准备就绪后,将ContentView.swift重置成您最初创建项目时的开始方式,这样我们就可以从头开始。

5.4K20

SwiftUI 与 Core Data —— 安全地响应数据

不过,通常我们在子视图中,会用 ObservedObject 来标注托管对象实例,实时响应数据变动,因此如果我们将代码调整成正常的编写模式就能看出问题所在了:struct Cell:View {...假设我们不限定转换过程运行的线程,备选值的方式对于由视图上下文创建的托管对象实例仍将有效( 但有可能会出现其它的线程错误 )。...在上节的演示中,当数据被删除后( 通过 onAppear 闭包中的延迟操作 ),NavigationView 会自动返回到视图中。在这种情况下,持有该数据的视图将伴随着数据删除一并消失。...但在非常多的情况下,开发者并不会使用演示中使用的 NavigationLink 版本,为了对视图拥有更强地控制力,开发者通常会选择具备可编程特性的 NavigationLink 版本。...如何将具体的托管对象类型以及 Core Data 操作视图、Features 中解耦出来。希望本文能够对你有所帮助。

3.3K20

React核心成员表示:JSX就是个错误

编程能力:? 不需要编译:? HTML描述视图能力最强(因为与DOM节点一一对应),但是缺乏编程能力。 Pug、Vue、JSX 视图描述能力:??? 编程能力:??~??? ?...都是在XML基础上演进的语法糖,拥有强大的描述视图能力。 他们的区别在于「编程能力」与「模版语法」的束缚之间取舍。 Flutter 视图描述能力:? 编程能力:????...使用函数调用的方式描述视图编程能力很强。 但是在描述嵌套的组件树结构时,函数调用不如XML描述能力强。...在保证强大的编程能力同时,也希望在视图表现力方面做的更好。...这种方式在React中被称为「受控组件」。 在SwiftUI中,子组件只需要将父组件传递的状态申明为@Binding,就能达到与父组件该状态「双向绑定」的效果。

1.2K30

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

阅读 The SwiftUI Layout Protocol [11]了解如何创建自定义布局。创建底部开始的滚动视图Q:我如何实现一个在底部对齐的滚动视图,在 macOS 上会不会有糟糕的性能?...在 SwiftUI 4 中,可以使用 .scrollContentBackground(.hidden) 隐藏列表的默认背景searchableQ:是否有办法在.searchable() 修饰器中编程方式设置搜索字段的焦点...A:你可以使用 dismissSearch 环境属性编程方式取消搜索字段。目前还没有 API 可以程序化地将焦点转至搜索字段。...对于可能造成卡顿的图片数据,放弃托管对象的图片关系中直接获取的方式。在 Cell 视图中,通过创建 request 私有上下文中提取数据并转换成图片。...但这个滚动有两大问题,1、是一个未公开的半成品,有可能会被 SwiftUI 框架中移除;2、不支持懒加载,即使和 Lazy 视图一起使用也会一次性加载全部的视图

14.7K30

SwiftUI 4.0 的全新导航系统

SwiftUI 4.0( iOS 16+ 、macOS 13+ )对导航系统作出了重大改变,提供了视图堆栈为管理对象的新 API ,让开发者可以轻松实现编程式导航。本文将对新的导航系统作介绍。...使用新的编程式 API ,开发者可以轻松地实现例如:返回根视图、在当前视图堆栈中添加任意视图视图跳转 )、视图外跳转( Deep Link )等功能。...NavigationStack NavigationStack 两个角度入手解决上述问题。...基于类型的响应式目标视图处理机制 比如下面的代码是在老版本( 4.0 之前 )SwiftUI 中使用编程式跳转的一种方式: struct NavigationViewDemo: View { @...分栏布局 在 SwiftUI 4.0 之前的版本,可以这样使用 NavigationView 来创建拥有左右两个栏的编程式导航视图: class MyStore: ObservableObject {

10.2K62

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

如果您曾经为UIKit或AppKit(Apple的iOS和macOS原始用户界面框架)编程,您会知道它们使用类而非结构体来构造视图。...SwiftUI并非如此:我们更喜欢将结构体用于整体视图,这有两个原因。 首先,有一个性能因素:结构体比类更简单,更快。...在UIKit中,每个视图都来自一个名为UIView的类,该类具有许多属性和方法:背景色,确定其放置方式的约束,用于将其内容呈现到其中的图层等等。...1000个SwiftUI视图甚至100,000个SwiftUI视图也是如此。他们是如此之快,以至于不再值得考虑。...但是,尽管性能很重要,但视图作为结构体还是有很多更重要的事情:它迫使我们考虑一种干净的方式隔离状态。

3.1K10

AVKit框架详细解析(四) —— 基于AVKit 和 AVFoundation框架的视频流App的构建

3) VideoPlayer 是一个方便的 SwiftUI 视图,需要播放器对象才能发挥作用。 您可以使用它来播放视频。 4) 默认情况下,SwiftUI 视图考虑设备的安全区域。...当您想对事物的工作方式进行非常具体的控制时,最好编写自己的视频视图。 让事情顺利进行是你的工作。...问题是你不能直接在 SwiftUI 中使用这个层。 毕竟 SwiftUI 没有 CALayer的概念。 为此,您需要回到 UIKit。...看起来您必须手动方式做事。 您需要做的就是跟踪您的播放器和当前播放的项目。 当它到达最后一个视频时,您将再次将所有剪辑添加到队列中。...当您返回到feed时,预览会停止的地方恢复。 6. Trying Not to Steal the Show 如果您打算制作一个包含视频的应用,那么考虑您的应用将如何影响您的用户非常重要。

6.9K10

肘子的 Swift 周报 #033|改善社区活跃度,仅更新论坛还不够

在这篇文章中,我将梳理首个版本起那些给我留下深刻印象的 SwiftUI 关键更新及其影响。这不仅是对 SwiftUI 诞生到逐渐成熟过程的回顾,也是一次对它所蕴含活力的新的认识。...MVVM: An architectural coding pattern to structure SwiftUI Views ( MVVM:用于构建 SwiftUI 视图的架构编码模式 )[12]...Antoine van der Lee[13] 由于 SwiftUI 的声明式编程范式和数据流管理方式与传统的 MVVM 实现有所不同,使得许多开发者对于 MVVM 是否适用于 SwiftUI 感到疑惑...在这篇文章中,Antoine van der Lee 探讨了如何以适合 SwiftUI方式实施 MVVM 架构模式来构建视图。...他指出,对于那些熟练的 UIKit 开发者来说,摒弃长期形成的编程习惯和思维方式完全适应 SwiftUI 的声明式和响应式编程模型,可能比新手更为困难。

11110

可视化编程,自动化减少20%代码量

SwiftUI通过4种方式,解决了上述问题: 用一个新的声明式UI结构,定义了的布局的外观和工作方式 更新UI预览会自动生成新的Swift代码,反之,更改Swift代码也会更新UI预览 Swift中的任何绑定例如有效的...让Xcode for iPad更上一层楼 开发者对Interface Builder的抱怨不是一天两天了,它大大增加了分解视图块以及视图控制器(view controller)使用视图的工作量,导致出现体积臃肿的视图控制器...而拥有更简单,更快速,更安全的SwiftUI为开发人员实现真正的平台独立性迈出了一大步。 人人都能编程 SwiftUI继承了Swift的理念:每个人都可以编程。...感受一下SwiftUI的代码风格 ? Github一个repo整理了在WWDC 2019发布的SwiftUI布局框架的一些官方示例: SwiftUI Essentials 创建和组合视图: ?...动画视图和过渡 ? App Design and Layout 复杂界面组合: ? 使用 UIControls: ? Framework Integration 使用 UIKit: ?

5.3K20

SwiftUI中使用UIKit视图

在相当长的时间中开发者仍需在SwiftUI中依赖UIKit(AppKit)代码。好在,SwiftUI为开发者提供了便捷的方式将UIKit(AppKit)视图(或控制器)包装成SwiftUI视图。...如果你已经对如何使用UIViewRepresentable有所掌握,可以直接SwiftUI风格化部分阅读 基础 在具体演示包装代码之前,我们先介绍一些与在SwiftUI中使用UIKit视图有关的基础知识...在绘制屏幕时,会视图树的顶端开始对视图的body求值,如果其中还包含子视图则将递归求值,直到获得最终的结果。...但SwiftUI无法真正进行无限量的调用来绘制视图,因此它必须某种方式缩短递归。为了结束递归,SwiftUI包含了很多的原始类型(primitive types)。...本节版本1.0结束时的代码为基础。 所谓的SwfitUI风格化,更确切地说应该是函数式编程的链式调用。将多个操作通过点号(.)链接在一起,增加可读性。

8.1K20

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

contextMenu_2022-10-26_14.01.21.2022-10-26 14_02_29如何对 @State 变量进行测试Q:对于测试 SwiftUI 视图中的 @State 变量是否有推荐的方式...只有将这些变量重构到视图模型中去这一种方式?A:如果在同一个视图中,有多个相互关联的 @State 属性,将他们提取到一个结构中或许是好的选择。...在单元测试中,很难对 SwiftUI 视图中的依赖( 符合 DynamicProperty 协议 )进行测试。这也是 Redux-like 框架的优势之一( 将状态视图中抽离出来,方便测试 )。...另外,按照这种方法,@FocusState 变量会变得没有反应,而且它不能被设置为 nil( 返回到以前的视图并没有移除键盘 )。是否可以在纯 SwiftUI 中完成( 不使用 UIKit )?...跨视图层次共享Q:在数据来自 API 响应的情况下,在多个视图之间共享数据的最佳方式是什么?

12.2K20

@State 研究

本文试图探讨并分析SwiftUI 中 @State的实现方式和运行特征;最后提供了一个有关扩展@State功能的思路及例程。读者需要对SwiftUI的响应式编程有基本概念。...研究的意义何在 我在去年底使用了SwiftUI写了第一个 iOS app 健康笔记,这是我第一次接触响应式编程概念。在有了些基本的认识和尝试后,深深的被这种编程的思路所打动。...app响应出现了问题一方面肯定和我的代码效率、数据结构设计欠佳有关;不过随着继续分析,发现其中也有很大部分原因来自于SwiftUI中所使用的响应式的实现方式。...读取包装数据也是本地的UserDefault里读取的。...在响应式编程开始流行的今天,越来越多的人都在使用单一数据源(Single Souce of Truth)的构架方式进行设计和开发。如何使用@State这种作用域范围仅限于当前视图的特性?

2.9K20

SwiftUI 布局协议 - Part2

当我们改变角度时,SwiftUI 会计算好每个视图最初和最终的位置,然后在动画期间内修改它们的位置,A点到B点成一条直线。...让我们回到轮子的这个例子,假设我们想要视图旋转起来,让它们指向中心。 布局协议只能决定视图位置和它们的建议尺寸,但是不能应用样式、旋转或者其他的效果。...视图的缩放和旋转要再一次使用双向自定义值实现。 在这个例子中在容器中一共有44个视图,所以我们的新容器将会分别12,12,12和8为一圈。 注意本案例中如何使用缓存与子视图通信。...一个有用的调试工具 回到SwiftUI 刚发布的时候,我尽力搞清楚布局是如何工作的,我希望我有一个像我今天要介绍的这种工具 。直到现在,它都是最好的工具,用来添加围绕视图的边框观察视图边缘。...总结 即使你不打算写你自己的布局容器,明白它是如何工作也会帮助你理解布局在 SwiftUI 的一般工作方式

2.7K30
领券