设计动机 当我们需要在视图的上层显示新的内容(例如:弹出信息、侧边菜单、帮助提示等)时,有很多优秀的第三方解决方案可以帮助我们分别实现,但没有一个方案可以同时应对不同的场景需求。...在 SwiftUI 中,描述视图已经变得十分的容易,因此我们完全可以将上述场景中的显示逻辑提炼出来,创建出一个可以覆盖更多使用场景的库,帮助开发者组织视图的显示风格和交互逻辑。...容器显示类型( Display type ) stacking 当容器内同时显示多个视图时,视图沿 Z 轴排列。其表现同 ZStack 类似。...使用者通过调用容器管理器的特定方法,让指定的容器执行显示视图、撤销视图等工作。 容器管理器的环境值 在 SwiftUI 中,视图代码通过环境值调用容器管理器。...animation 在 SwiftUI 视图外使用 如果想在 SwiftUI 视图之外调用容器管理器,可以直接调用 ContainerManager 的单例: let manager = ContainerManager.share
前言 在 SwiftUI 中,我们可以通过添加不同的交互来使我们的应用程序更具交互性,这些交互可以响应我们的点击,点击和滑动。...Circle() .onTapGesture { // Respond to Tap Gesture } SwiftUI 文档中使用的其他选项是通过创建手势并将其配置为属性,然后将其与...我们可以设置一个最小持续时间,以识别我们的长按手势。可以在 LongPressGesture 初始化程序中进行设置。...LongPressGesture(minimumDuration: 2) 然后,我们可以使用 .updating 方法在长按期间执行操作,并使用 .onEnded 在识别到我们的手势时执行操作。...在此示例中,我将在长按操作期间更新 Circle() 的大小和颜色,并且当识别出手势时,我将显示“文本已完成”。
我希望构建类似于 App Store Connect 中的选择器组件,使用户体验尽可能熟悉,并在本文中,将展示如何使用 SwiftUI 为 macOS 构建了这个组件。...创建选择器组件让我们分析一下,我们有一组想要在 SwiftUI 列表中显示的构建。每个构建都包含一组属性,其中之一是 betaGroups,它是一个表示构建所属测试群组的结构体数组。...使用 .overlay 修改器在用户悬停在测试群组组件上时显示一个移除按钮。该按钮从构建所属的测试群组列表中移除测试群组。...以上代码片段使用了 BetaGroup 结构体上的一个名为 displayName 的属性来显示测试群组的名称,类似于在 App Store Connect 中的显示方式,显示名称中的前两个单词的首字母大写...总结文章介绍了如何使用 SwiftUI为macOS 创建类似于 App Store Connect 的选择器组件。
SwiftUI 手势在某种程度上降低了使用门槛,但由于缺乏提供底层数据的 API,严重制约了开发者的深度定制能力。...在 SwiftUI 下,我们无法拥有类似构建全新 UIGestureRecongnizer 的能力。所谓的自定义手势,其实只是对系统预置手势的重构而已。...手势在按压过程中,可以根据指定的时间间隔进行类似 onChanged 的回调。本例程着重演示如何通过视图修饰器包装手势的方法以及 GestureState 的使用。...TapGesture、LongPressGesture 均在满足触发条件后会自动终止手势,无法实现对任意时长的支持 2.6 不足及改善方法 当前的解决方案没有提供类似 LongPressGesture...在本例中,我们选择在 TapGesture 的 onEnded 中回调用户的闭包 总结 当前 SwiftUI 的手势,暂处于使用门槛低但能力上限不足的状况,仅使用 SwiftUI 的原生手段无法实现非常复杂的手势逻辑
是否有任何建议用来检测列表中的行选择,类似于 “NavigationLink”,但不导航到另一个视图(例如,显示 Sheet 或从列表中选择一个选项 )?...A:看一下上下文菜单修饰器( contextMenu )的 primaryAction 参数。该 API 也有一个 forSelectionType 参数,支持多选。...在 SwiftUI 4.0 中,contextMenu 的功能获得了不小的提高。例如一个上下文菜单中可以有多个选项、支持 primaryAction、以及可定制预览视图。...这也可以和 OpenWindowAction[16] 一起使用。请注意,你的数据需要是可选的,或者指定一个默认值,因为在某些情况下,框架自身也会创建窗口( 例如,当选择新窗口菜单项 )。...A:实现近似行为的方法是在菜单中使用命令来提供相同的操作。通常情况下,应该有列表让人们知道有哪些键盘快捷键可用。但是,如果这不适合你的使用情况,我们会对这方面的增强请求反馈感兴趣。
因此,如果你正在创建一个视图来显示可滚动的内容,并可能进行选择操作,那么在 iOS 和 macOS 上使用 List 将有最好的体验。...Table 中上下文菜单Q:如果我在 TABLE 上添加了一个上下文菜单,我如何确定哪一行导致了菜单的显示(无需选择该行)?...Swiftcord[12] 的代码展示了如何在 SwiftUI 下实现倒置列表。阅读 优化在 SwiftUI List 中显示大数据集的响应效率[13] 一文,了解苹果工程师推荐的方法。...对于类似的情况,也可以不使用显式动画驱动( 不使用 withAnimation ),只需将 .animation(.default, value: isPresented) 移动到 VStack 之外即可...Too complex to type checkQ:我在 iOS 14 SwiftUI 中遇到一个问题,我试图有条件地显示 3 个符合 Shape 协议的对象中的一个。
01显示最重要的栏目 Tab bar应该只包含最有用的目标页面入口,添加无用的入口会让Tab bar变得混乱。要记住,Tab bar的入口一定是用户使用的最高频的。...特别做法:Pinterest隐藏文字 Pinterest的做法非常特别,在用户刚开始使用应用的时候,会显示文本+icon的方式,随着时间的推移用户习惯了之后,Pinterest会隐藏标签。...05 避免隐藏菜单栏 避免自动隐藏菜单栏,因为它包含了最重要的内容,如果隐藏后会增加用户使用的难度。所以,确保始终显示你的菜单栏,几乎所有的应用都应该遵循这一准则。当然,也有一些特别的应用例外。...06 按约定顺序排列菜单 按顺序排列菜单内容是必要的,因为每个应用程序都是为了更好的清晰度和可用性而这样做的,用户喜欢看到排列好的东西,菜单栏就是其中之一。大型应用程序基本上遵循类似的设计规则。...Pinterest 过去常常首先显示主屏幕,搜索标签用于搜索内容,通知标签用于更新和配置文件用于其他东西。
image-20220620142551830 上图是我们使用 List 创建一个有关 Locale 信息的表格,每行都显示一个与 Locale 有关的数据。...,SwiftUI 会扩展更多的样式到 iPadOS 平台 行选择 在 Table 中启用行选择与 List 中的方式十分类似: struct TableDemo: View { @State var...} } } table_drag_demo_2022-06-20_19.36.09.2022-06-20 19_37_28 交互 除了行选择和行拖拽外,Table 还支持对行设置上下文菜单...出现上述问题的主要原因是,苹果没有采用其他 SwiftUI 控件常用的编写方式( 原生的 SwiftUI 容器或包装 UIKit 控件),开创性地使用了 result builder 为 Table 编写了自己的...上下文菜单、选择 ) List( Grid 中的 GridRow 并非真正意义上的行 ) 需要视图可渲染( 保存成图片 ) LazyVGrid、Grid 可固定的标题行 List、LazyVGrid、Grid
基于类型的响应式目标视图处理机制 比如下面的代码是在老版本( 4.0 之前 )SwiftUI 中使用编程式跳转的一种方式: struct NavigationViewDemo: View { @...Detail 栏( 最右侧栏 ) doubleColumn 在三栏状态下隐藏 Sidebar ( 最左侧 )栏 all 显示所有的栏 automatic 根据当前的上下文自动决定显示行为 上述选项并非适用于所有的平台...,例如,在 macOS 上,detalOnly 不会起作用 如果想在 SwiftUI 4.0 之前的版本上使用类似的功能,可以参考我在 用 NavigationViewKit 增强 SwiftUI 的导航视图...iPad 在 landscape 显示状态下,默认即为此种模式 automatic 默认值,根据上下文自动调整外观样式 在 NavigationTitle 中添加菜单 使用新的 navigationTitle...构造方法,可以将菜单嵌入到标题栏中。
dump(_n) }}Sheet 视图的上下文当 SwiftUI 创建并显示一个 Sheet 视图时,并非在现有的视图树上创建分支,而是新建一棵独立的视图树。...也就是说 Sheet 中的视图与原有视图分别处于不同的上下文中。在 SwiftUI 早期的版本中,对于分别位于不同上下文的独立的视图树,开发者需要显式为 Sheet 视图树注入环境依赖。...这意味着,相较于在原有视图树上创建分支,在新上下文中重建视图树的开销更大,需要进行的工作也更多。而 SwiftUI 为了优化效率,通常会对若干操作进行合并。...方案二、使用 @StateObject 强制刷新我们可以通过创建引用类型的 Source 来避免在不同上下文之间关联 State 可能出现的顺序错误。...在面对这些“灵异现象”时,如果我们能对其进行更多的研究,那么不仅可以在今后避免类似的问题,而且在分析的过程中,也能对 SwiftUI 的各种运行机制有深入的掌握。希望本文能够对你有所帮助。
社区不仅为语言增添了更适合嵌入式开发的 功能和示例[6],更有厂商推出了易于使用的 一体化开发套件[7]。...需要用开放的心态和全新的视角去学习和使用这些新工具。将采用新框架的过程视为将项目向更安全、更现代化方向重构的绝佳机会。...在实际开发中,Edvinas Byla 意识到 LazyVGrid 的性能并不理想,且不能满足他对上下文菜单行为的特定需求,因此他决定采用 NSTableView 作为替代方案。...通过对 NSTableView 和 NSTableCellView 的精心定制,他不仅显著优化了滚动体验,还解决了上下文菜单相关的问题。...实际上,该应用的复杂模板编辑器几乎完全使用 SwiftUI 开发,且表现出色。这一点彰显了 SwiftUI 在实际应用中的强大潜力和灵活性。
结合两年来我在SwiftUI中使用Core Data的经验和教训,我们将在本文中探讨: •导致SwiftUI预览崩溃的部分原因•如何在之后的开发中避免类似的崩溃出现•如何在Xcode中安全可靠地预览含有...Redux-like SwiftUI + Combine是苹果推出的声明+响应式结构方案。SwiftUI应用程序的开发逻辑非常类似于Redux设计模式。...由于前文中提到的SwiftUI App life cycle的独特性,你无法在根视图中使用单例来注入持久化上下文。...由于预览也是模拟器,在它的沙盒中同样可能出现类似的问题。可以使用上文中关于预览模拟器的修复方法来尝试解决。...SwiftUI通常采用Redux的开发模式,通过将获取到的Core Data数据转换成标准的Swift结构从而避免在视图中使用托管对象上下文或托管对象。
,直接定位到滚动视图的特定位置,只能使用一次 )、全新的滚动条控制( 闪烁 )、可自定义行视图在滚动区域的顶端和显示区域的显示状态( 例如可用其实现类似 watchOS 中的滚动到顶端子视图缩小的视觉效果...在不考虑兼容旧版本的情况下,我认为 SwiftUI 5.0 的升级可以打 95 分(满分 100 分),不过考虑到很多的开发者在相当一段时间内还无法使用这些新功能,心情就会异常的低落。...这是我目前整理的一些有关 SwiftData 的问题和注意事项( 原文发表在推文中,没有进行更系统的归纳): 尚不支持公共和共享数据的云同步 在当前版本中,通过其他上下文(ModelContext)创建的数据并不会自动合并到视图上下文中...的性质与通过宏创建的 Observed 状态类似,可直接驱动视图更新(传递时无需使用属性包装器) Attribute 的派生选项被废弃了 可以在 Xcode 中使用 Model Editor 将 Model...对于绝大多数开发者来说,一旦能够在应用中使用这些新功能,苹果或许又会带来更多的新诱惑。SwiftUI 的新特性极大拓展了其表达能力,但同时也增加了其学习曲线,特别是对初学者而言。
本文中我们将探讨在 SwiftUI 视图中批量获取 Core Data 数据的方式,并尝试创建一个可以使用 mock 数据的 FetchRequest。...由于最终我们需要在视图中使用 AnyConvertibleValueObservableObject( 托管对象 ),因此数据的获取过程必须是在主线程上下文中进行的( 数据绑定的上下文是 ViewContext...FetchRequest 获取 )由于 TCA 的 Reducer 无法与视图的存续期自动绑定,上面的可感知延迟在每次触发 onAppear 时都将出现最终,我决定放下心结,仍然采用在视图中使用类似...MockableFetchRequest 的使用方法MockableFetchRequest 提供与 FetchRequest 类似的动态获取数据的能力,但它有如下的特点:MockableFetchRequest...数据( 因为 WrappedID 的存在,我们可以很容易创建 mock 数据 )无论上述哪种方式,开发者都需放弃使用 SwiftUI 原生的 Section 功能,在惰性容器中,根据提供的附加数据自行对数据做分段显示处理
下面会先给出如何用storyboard给相应的控件添加手势,然后在用纯代码的方式给我们的控件添加手势,手势的用法比较简单。和button的用法类似,也是目标动作回调,话不多说,切入今天的正题。...不过用storyboard可以减少我们的工作量,这两个要配合着使用才能大大的提高我们的开发效率。...alloc] initWithTarget:self action:@selector(longPressGesture:)]; 3 //设置长按时间 4 longPressGesture.minimumPressDuration...= 0.5; //(2秒) 5 [self.view addGestureRecognizer:longPressGesture]; 在对应的回调方法中添加相应的方法(当手势开始时执行...(通过translationInView获取移动的点,和TouchesMoved方法类似) 1 //拖动手势 2 -(void) panGesture:(id)sender 3 { 4 UIPanGestureRecognizer
创建项目 导航区的第三个菜单 Symbol navigator 替换为 Bookmark navigator。 导航区 调试区的菜单发生变化,并且输出的内容随着不同的级别拥有不同的背景色。...(macro)实现 SwiftUI 一样进行实时预览。...image.png 代码支持添加 Bookmark,在某一行代码或者选中多行代码后右击,可以看到相应的添加菜单。可以在 Bookmark navigator 中查看添加的所有 Bookmark。...条件编译代码随着选择的条件会高亮显示对应条件的编译代码。 右击菜单 Show Quick Help 显示更加丰富的文档内容。...编辑时 Quick Actions 可以快捷访问对应内容的所有菜单,快捷键command + shift + A。 遇到多参数的方法时,可以通过键盘方向键 —> 显示所有可能的参数组合。
用 “出现之前” 来描述 onAppear 或 task 闭包的调用时机属于无奈之举。在不同的上下文中,“出现之前”会有不同的解释。...task(priority: .background) { // do something}任务优先级并不会影响创建任务所使用的线程task vs onChange另一个版本的 task 修饰器则提供了类似...,每秒更新一次 date 变量,并且在控制台中显示当前的任务 ID 及时间。...非常遗憾,当前上文中所有的使用 task 创建的异步任务都是运行在主线程当中的。...( 闭包继承了 body 的 actor 上下文 )。
新框架使用声明性范例,让开发者用更少的代码编写相同的 UI。 SwiftUI 的愿景是降低开发 iOS 门槛,吸引更多开发者、丰富 iOS 的业态。...这是个宝贵的机会,能让我认真体验一把 SwiftUI 并探索其内部工作原理。 起初项目工作良好,我对 SwiftUI 的表现可以说非常满意,我甚至创建了自己的修改器,以便更轻松地显示警报消息。...利用这款工具,我可以用多个 sprite 拼接成复杂的资产,再最终为它们制作动画。它的显示效果就是主窗口中的一张表,出于学习的目的,我当然还是想继续用 SwiftUI 喽。...我需要为每个上下文创建一个视图,这些视图同时又是其他视图的「子视图」,然后把需要的数据传递给特定视图。...我刚开始以为是因为地图编辑器的 SpriteKit 主视图仍在后台渲染。所以我尝试在工作表显示出来后禁用渲染,但结果没有任何改变。 变更从一种环境传播至另一环境时,我也遇到了类似的延迟问题。
随着 Swift 5.5 引入了 async/await 特性,苹果也为 SwiftUI 添加了 task 视图修饰器,以方便开发者在视图中使用基于 async/await 的异步代码。...原文发表于我的博客 肘子的Swift记事本 task vs onAppear SwiftUI 提供了两个版本的 task 修饰器,版本一的作用和调用时机与 onAppear 十分类似: public func...修饰器则提供了类似 onChange + onAppear 的联合能力。...,每秒更新一次 date 变量,并且在控制台中显示当前的任务 ID 及时间。...( 闭包继承了 body 的 actor 上下文 )。
领取专属 10元无门槛券
手把手带您无忧上云