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

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

众所周知,SwiftUI 是一个响应式框架,这意味着,当数据源发生变化时,框架会自动更新视图。同样,当我们想调整视图显示,应直接对状态进行修改。...它的复现条件非常简单:真机上测试( 模拟器上不容易复现 )点击 “GO” 按钮进入下一层视图点击 “Show Sheet” 按钮弹出 Sheet通过下滑手势取消 Sheet Sheet 取消后(动画结束...它的复现条件如下:iOS 16 系统,真机或模拟器上测试点击视图列表中的按钮,可以进入下一级视图。...请至少进入第三级视图滚动当前视图当视图处于滚动状态点击 NavigationStack 左上角的 “Back” 按钮。...由于返回上层视图,状态尚未更新,因此清理 AG (返回动画运行中),会破坏应用程序的 AttributeGraph 完整性,从而导致应用程序死锁或崩溃。

589110

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

这是个宝贵的机会,能让我认真体验一把 SwiftUI 并探索其内部工作原理。 起初项目工作良好,我对 SwiftUI 的表现可以说非常满意,我甚至创建了自己的修改器,以便更轻松地显示警报消息。...它的显示效果就是主窗口中的一张,出于学习的目的,我当然还是想继续用 SwiftUI 喽。毕竟初次尝试肯定会有种种问题,应该再给它一次机会。...但上图展示的效果其实是 AppKit 中完成的,因为我 SwiftUI 一直实现不了预期的功能。大家应该注意到了,中间的 SpriteKit 视图上有三个按钮(分别是 +、200% 和 -)。...这些按钮只跟管理 SpriteKit 视图缩放的 @State 相关联。尽管几乎涉及任何其他数据,界面更新前单击这些按钮,也会产生将近一秒钟的巨大延迟。...所以我尝试工作显示出来后禁用渲染,但结果没有任何改变。 变更从一种环境传播至另一环境,我也遇到了类似的延迟问题。

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

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

你已经 iOS 应用程序工作了一段时间,你认为你很聪明。 你以为你已经做到了,嗯? 是的,你可能可以做一些基本的网络。...构建并运行该项目,您将看到一个应用程序,该应用程序已经设置了一个充满潜在视频的表格,供您观看。 您的目标是在用户点击其中一个单元格显示视频播放器。 1....您可以看到视频播放器显示了一组基本控件。 这包括一个播放按钮、一个静音按钮和用于前进和后退的 15 秒跳过按钮。 2. Adding Remote Playback 那很容易,对吧?...然后,您需要添加一些自定义手势,例如点击打开声音和双击将其更改为 2 倍速度。当您想对事物的工作方式进行非常具体的控制,最好编写自己的视频视图。 让事情顺利进行是你的工作。...您会在左上角看到画中画按钮……否则不会! 缺点是,撰写本文,iOS 14.5是可用的最新版本,VideoPlayer 的 SwiftUI 视图未显示画中画按钮

6.9K10

如何结合 Core Data 和 SwiftUI

为了进行试用,请点击 “Add Entity” 按钮创建一个新实体,然后双击其名称将其重命名为 “Student”。...接下来,单击 “Attributes”正下方的+按钮以添加两个属性:“id”作为 UUID 和 “name” 作为字符串。...如果我们对 Core Data 说“这不是必须的”(您可以模型编辑器中完成),它仍然会生成可选的 Swift 属性,因为所有 Core Data 关心的是属性保存具有值——在其他时间它们可以为 nil...为了解决这个问题,我们将在列表下方创建一个按钮,每次点击都会添加一个新的随机学生,但是首先我们需要一个新属性来存储托管对象上下文。 让我重申一下,因为这很重要。...我们无法代码中看到该类,因为它是构建项目自动生成的,就像 Core ML 的模型一样。

11.8K30

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

众所周知,SwiftUI 是一个响应式框架,这意味着,当数据源发生变化时,框架会自动更新视图。同样,当我们想调整视图显示,应直接对状态进行修改。...它的复现条件非常简单: 真机上测试( 模拟器上不容易复现 ) 点击 “GO” 按钮进入下一层视图 点击 “Show Sheet” 按钮弹出 Sheet 通过下滑手势取消 Sheet Sheet 取消后...它的复现条件如下: iOS 16 系统,真机或模拟器上测试 点击视图列表中的按钮,可以进入下一级视图。...请至少进入第三级视图 滚动当前视图 当视图处于滚动状态点击 NavigationStack 左上角的 “Back” 按钮。...由于返回上层视图,状态尚未更新,因此清理 AG (返回动画运行中),会破坏应用程序的 AttributeGraph 完整性,从而导致应用程序死锁或崩溃。

26720

【visionOS】从零开始创建第一个visionOS程序

你也可以视图中添加SwiftUI手势识别器来处理点击、长按、拖动、旋转和缩放手势。...点击并拖动应用程序内容下方的窗口栏,以重新定位窗口环境中的位置。将指针移动到窗口栏旁边的圆圈上,显示窗口的关闭按钮。将光标移动到窗口的一个角落,以将窗口栏变为调整大小控件。...当你准备界面中显示3D内容,使用RealityView。这个SwiftUI视图作为你的RealityKit内容的容器,并允许你使用熟悉的SwiftUI技术更新内容。...当指定的手势发生在实体上SwiftUI执行提供的闭包。 下面的示例将一个点击手势识别器添加到上一个示例中的球体视图中。...如果取消可见空间,那么当您尝试打开另一个空间,系统将发出运行时警告。

71040

架构之路 (五) —— VIPER架构模式(一)

它包含在starter中,因此您可以本教程结束完成应用程序。 这个示例使用的是Pixabay,这是一个获得许可的照片共享站点。要将图像拉入应用程序,您需要创建一个免费帐户并获得一个API密钥。...当您查看图表,您可以看到数据视图view和实体entities之间流动的完整路径。 SwiftUI有自己独特的做事方式。...命令式UI范例中——换句话说,UIKit中——路由router将负责显示视图控制器或激活segue。 SwiftUI将所有目标视图声明为当前视图的一部分,并根据视图状态显示它们。...当您将其放置NavigationView中,该链接将成为一个按钮,将destination推送到导航堆栈上。 content块可以是任何一个SwiftUI视图。...构建并运行,现在,当用户点击单元格,它将把它们路由到“Hello World”TripDetailView。 3.

17.4K10

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

假设我们想创建一个类似于 iMessage 的视图,在那里你可以看到一个信息列表(与本例无关),视图的底部有一个文本框。当用户点击文本字段,键盘会在其工具栏中出现一个文本字段。...或者大多数应用程序只需要一个 WindowGroup ?A:多场景对于建立复杂的应用程序是很有用的,特别是 macOS 上。...不过,传统的 viewModel 意义上,我建议将视图( 结构本身 )作为视图模型。...在有些情况下,我想根据视图是否折叠来做决定( 例如,如果展开,详细视图中显示一条信息,如果折叠,则显示一个警告或其他指示 )。...A:如果你 iOS 上使用 UITextField 遇到性能问题,你可以尝试避免每个视图都是 UITextField ,默认渲染为 Text ,当文本被点击动态切换为 UITextField 。

12.2K20

Xcode 11 初体验

直接点击这个按钮,会横向进行分割。按住 Option 按键点击它,会纵向分割, 下图是一个分割后的界面示例 上图中界面被分成了 3 个编辑窗口。...当你的项目关联了版本控制工具,比如 Git, Xcode 会检测出当前文件哪些地方相对于上次递交的版本有更改,并且会通过左边显示一个蓝色线条标记出来: Change Bar 点击左键还可以选择 show...开发和调试,随时暗黑和明亮模式之间进行切换。 Asset目录可以使你轻松的控制图像和颜色暗黑和明亮模式之间进行切换。...点击Stash 按钮自动跳转到Git管理Tab 下。... Stash 右下角会有 Stash 功能选择按钮(也可以左侧Stash Changes右键弹出)。

3.1K10

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

ContextView 包含 Text 的情况下, Sheet 显示后,n 的 _wasRead 将转变为 true( Sheet 视图显示后,方创建关联 )。... SwiftUI 早期的版本中,对于分别位于不同上下文的独立的视图树,开发者需要显式为 Sheet 视图树注入环境依赖。后期版本已为开发者自动完成该注入工作。...这意味着,相较于原有视图树上创建分支,新上下文中重建视图树的开销更大,需要进行的工作也更多。而 SwiftUI 为了优化效率,通常会对若干操作进行合并。...Sheet 中的 Text 显示 n = 1点击 Sheet 中的 Close 按钮,执行 Button 闭包,重新获得 n 的当前值( n = 2 ),打印值为 2当 ContextView 中包含...面对这些“灵异现象”,如果我们能对其进行更多的研究,那么不仅可以今后避免类似的问题,而且分析的过程中,也能对 SwiftUI 的各种运行机制有深入的掌握。希望本文能够对你有所帮助。

1.9K20

探索 App Clips

例如点击Safari Banner调起App Clips,调起时会带一个URL过来,系统会根据调用URL来确定卡片显示的数据,随后将数据例如标题、背景图等显示App Clips的卡片页。...如果调起App Clips手机处于锁屏状态,卡片页不会开启后台下载,当用户点击Open后才会开始下载并展示loading页面。...配置App Clips可以选择高级设置,高级设置中可以多套标题和封面图。苹果会根据配置的URL作区分,显示不同的封面图。...例如在使用定位功能,App Clips不需要用户的完整授权,可以请求“部分授权”,用户可以卡片页选择是否关闭,就是卡片页下方蓝色按钮。...App Clips的通知通知中心显示,和普通通知看起来是一样的,但“部分授权”有效期八小,正常弹窗授权有效期一周,我们也可以选择请求用户授权普通通知。

1.8K20

避免 SwiftUI 视图的重复计算

get } // 将视图加载到视图树中,调用此方法,完成关联工作 public static func _makeProperty(in buffer: inout _DynamicPropertyBuffer...当 SwiftUI 将视图从视图树上删除,会一并完成对 SwiftUI 数据池以及关联的清理工作。如此,使用 State 包装的变量,其存续期将与视图的存续期保持完全一致。...其他建议 需要跳跃视图层级,考虑使用 Environment 或 EnvironmentObject 对于紧密的 State 关系,考虑同一个视图层级使用多个 EnvironmentObject...点击 random age 按钮修改 age 属性后,尽管 StudentNameView 中并没有使用 age 属性,但 SwiftUI 仍然对 StudentNameView 和 StudentAgeView...图片 这是因为,乍看起来,我们并没有 CellView 中引入会导致更新的 Source of Truth,但由于我们将 store 放置闭包当中,点击按钮后,因为 store 发生了变动,从而导致

9.2K81

面向所有人的 UI 编程 :透过点按弹窗初尝 SwiftUI

事实上,苹果在今年 WWDC 19 开发者大会中,推荐开发者将应用内弹窗安置应用程序的方方面面,以保证 iOS 用户体验的一致性。 ?...SwiftUI 集众家之长,具有诸多优秀特性,可以预见它将会出现在诸多应用程序中。若你有兴趣,我会在其它文章中详解 SwiftUI,本文只着重讲其中弹窗的写法与逻辑。 你会怎样描述一个程序?...下图中程序的功能很简单:长按这句名言后,会出现点按弹窗,你可以点击复制按钮将这句话复制到系统剪贴板中。 ? 试想你是一名美术,完全不了解程序。...纵向排列的 View SwiftUI 里叫做 VStack,它用一个花括号 {包住里面的内容};而文字的 View SwiftUI 里叫做 Text。...若你想仔细的学习 SwiftUI 和苹果或安卓应用程序开发,欢迎文末写下你想学习的内容,我会参考写文。

2.1K40

SwiftUI Overlay Container 2 —— 可定制、高效、便捷的视图管理器

仅需简单配置,SwiftUI Overlay Container 即可帮你完成从视图组织、队列处理、转场、动画、交互到显示样式配置等基础工作,让开发者可以将精力更多地投入到应用程序视图的实现本身。... SwiftUI 中,描述视图已经变得十分的容易,因此我们完全可以将上述场景中的显示逻辑提炼出来,创建出一个可以覆盖更多使用场景的库,帮助开发者组织视图的显示风格和交互逻辑。...: AConfiguration()) 当无需视图容器附着某个视图: ViewContainer("containerB", configuration: BConfiguration()) 容器中显示视图...当给定的视图数量超过了容器设定的最大视图数量,超过的视图会暂存在等待队列中,并在已显示视图取消后,逐个递补。 multiple oneByOne 同一间只能在容器中显示一个视图。...使用者通过调用容器管理器的特定方法,让指定的容器执行显示视图、撤销视图等工作。 容器管理器的环境值 SwiftUI 中,视图代码通过环境值调用容器管理器。

2.1K20

iOS开发之WidgetKit补充

.configurationDisplayName:设置 Widget 添加界面中显示的标题。 .description::设置 Widget 添加界面中显示的描述。...getTimeline 的方法里有一个 policy 参数,表示刷新的时机,可以选择.never(刷新),.atEnd(Entry 显示完毕之后自动刷新) 或 .after(date)(到达某个特定时间后自动刷新...Widget 本质:一个随着时间线而更新的 SwiftUI View。 运行 先运行 App 再运行 Widget 交互 只能点击点击会打开 App。...也可以通过.widgetURL(myDeeplink)方法配置当 Widget 被点击触发哪个 Deep Linking,也可以通过使用链接使 Widget 的不同部分触发不同的 Deep Linking...(可以直接理解为 Widget 只是一个按钮,点按这个按钮会跳转到指定 URL 对应的页面)。

1.9K30

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

除此以外,当你试图实现一个可以各种情况下使用通用的布局,一定要考虑!但是,如果你只是自己使用它,并且条件可控,那么处理这些情况也是合理的。...我建议的方法是主线程之外做任何昂贵的或阻塞的工作,然后只需要写入 ObservableObject 上的属性再跳回主线程。...鉴于动态文本大小应用程序运行时可能会发生变化,衡量给定字体的文本大小的最佳方法是什么?A:你好!我们新的布局协议支持这个功能。...我建议尝试旋转滚动视图。Swiftcord[12] 的代码展示了如何在 SwiftUI 下实现倒置列表。...阅读 优化 SwiftUI List 中显示大数据集的响应效率[13] 一文,了解苹果工程师推荐的方法。两种方案中,如果在数据量很大的情况下,我更倾向于第一种方式,这样可以按需求读取数据。

14.7K30

酷我音乐iOS小组件适配开发实践

(我们推荐这样实现,因为这样做可能一个组件只能适配iOS,却不能适配其它 例如watchOS、等系统,就造成兼容性下降等问题.) 2.SwiftUI中支持的Button widget中无法正常使用...小组件里面加一个按钮经常出现边缘太大,样式填充问题(红线是笔者截图加上去的请忽略) 浅蓝色透明度的填充部分,需要设置按钮显示样式才能去掉,默认就是上图这种方式有填充....经过上述操作后,我们只能给小组件加一个按钮,并不能实现点击按钮触发事件,当我们点击button的时候直接拉端,根本不给我们处理这个按钮点击机会. 这是因为小组件不支持常规按钮....,如果太频繁的刷新数据驱动UI很容易造成被系统忽略,UI上的表象就是啥也没变.所以各位一定注意 当我们点击按钮触发AppIntent调用的时候,系统会立即刷新一次本次点击的小组件,如果点击过快第二次将会生效...上述的小组件本质就是这个原理,为了更多小组件必须用Bundle来管理,通过不同的Bundle来区分和显示更多小组件. 10.如何决定什么时候拉端什么时候拉端 开发小组件的时候我们通过AppIntent

54310

酷我音乐iOS小组件适配开发实践

(我们推荐这样实现,因为这样做可能一个组件只能适配iOS,却不能适配其它 例如watchOS、等系统,就造成兼容性下降等问题.) 2.SwiftUI中支持的Button widget中无法正常使用...小组件里面加一个按钮经常出现边缘太大,样式填充问题(红线是笔者截图加上去的请忽略) 浅蓝色透明度的填充部分,需要设置按钮显示样式才能去掉,默认就是上图这种方式有填充....经过上述操作后,我们只能给小组件加一个按钮,并不能实现点击按钮触发事件,当我们点击button的时候直接拉端,根本不给我们处理这个按钮点击机会. 这是因为小组件不支持常规按钮....,如果太频繁的刷新数据驱动UI很容易造成被系统忽略,UI上的表象就是啥也没变.所以各位一定注意 当我们点击按钮触发AppIntent调用的时候,系统会立即刷新一次本次点击的小组件,如果点击过快第二次将会生效...上述的小组件本质就是这个原理,为了更多小组件必须用Bundle来管理,通过不同的Bundle来区分和显示更多小组件. 10.如何决定什么时候拉端什么时候拉端 开发小组件的时候我们通过AppIntent

82830
领券