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

如何让 SwiftUI 列表变得更加灵活

SwiftUI 中初版概念和 API 编写,下面让我们尝试使用新功能来为我们列表实现自定义样式,并且使代码更加健壮。...为了演示这种情况,我们 List 中嵌套一个 ForEach (因为 SwiftUI 中,列表变化一版都是由 ForEach 触发,而不是由 List 触发)。...由于每个 article 值 ForEach 闭包中都是可变,我们可以使用 swipeActions 修饰符来实现每个 NavigationLink 项目视图自定义滑动操作。...下拉刷新 就个人而言,下拉刷新 SwiftUI 功能请求列表中非常重要,所以我很高兴看到今年版本增加了对这种非常常见 UI 范式内置支持。...item 上调用,而不是列表本身上调用,这为我们提供了很大灵活性,可以根据想要构建 UI 类型动态隐藏或显示每个分隔符。

4.8K41

使用 SwiftUI 创建一个灵活选择器

前言 最近,正在开发一个 Dribbble 上找到设计 SwiftUI 实现时,想到了一个点子,可以通过一些酷炫筛选器扩展该项目以缩小结果列表。...Identifiable 和 Hashable 协议确保我们可以轻松创建具有 ForEach 循环 SwiftUI 视图。...因此,将使用符合 Selectable 协议泛型类型 T 创建 FlexiblePicker。这样,以后更容易重用该组件,因为它将是独立于类型实现选择器本身之前,列出了所有可自定义属性。...如我之前所提到,视图将使用嵌套 ForEach 循环创建。 需要记住是,ForEach 循环要求迭代集合中每个元素必须符合 Identifiable 协议,或者应该具有唯一标识符。...如果我们只插入另一个 ForEach 循环,我们将在视图适当功能性方面遇到问题,因为 ForEach 不是一种 View。

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

解析SwiftUI布局细节(二)循环轮播+复杂布局

NavigationView + NavigationLink 界面跳转,苹果给 SwiftUI 使用例子中就是这样写,当然我们正常使用中这样写也没啥问题,那我们界面跳转问题是什么呢?...通过它我们可以避免初始 View 时创建 ObservableObject, 而是从环境中获取 ObservableObject,像 @EnvironmentObject,@ObservedObject...3、再提一点关于上面说滚动视图,UIKit中我们可以用UICollectionView搞定一切,但是SwiftUI中没有这个控件,建议采用方式是 ScrollView + HStack + VStack...方式去实现,很多同行有说目前来看SwiftUIList在数据量大情况下性能不是特别好,采用ScrollView是个不错方式,而且也很容易构建出来,并不是说每一个Item位置都需要你去计算,...区别于我们UIKit创建方式,SwiftUI对它进行了简化,具体创建如下: /// SwiftUI对定时器简化,可以进去看看具体参数定义 private let timer = Timer.publish

11.8K20

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

.}// 可以用类似字典方式对元素进行操作,快速定位,同时更新 IdentifiedArray 时,也不容易引发 ForEach 异常todos[id:id] = newTodo自定义布局Q:实现自定义布局时...阅读 The SwiftUI Layout Protocol [11]了解如何创建自定义布局。创建从底部开始滚动视图Q:如何实现一个底部对齐滚动视图, macOS 上会不会有糟糕性能?...Swiftcord[12] 代码展示了如何在 SwiftUI 下实现倒置列表。阅读 优化 SwiftUI List 中显示大数据集响应效率[13] 一文,了解苹果工程师推荐方法。...定制 ListQ:是否有办法以完全可定制方式使用 List ,这样就可以实现删除缩进、分隔线,甚至更改整个列表背景等操作? 目前,总是去找 LazyVStack 来代替。...将背景扩展到安全区域Q:如果有一个自定义容器类型,可以接受一个顶部和底部视图,是否有办法让 API 调用者将所提供视图背景扩展到安全区域内,同时将内容( 文本或按钮 )保留在安全区域内?

14.7K30

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

使用 environmentObject 情况下,如何避免创建实例视图被重新计算Q:如何在避免重新计算顶层视图 body 情况下不同子树两个子视图之间共享状态( 例如 ObservableObject...不过,传统 viewModel 意义上,建议将视图( 结构本身 )作为视图模型。...最近,注意到 SwiftUI 视图 onAppear 在意想不到时间启动,比如当 UITabBarController 被创建时,而不是当视图本身出现时。...不是因为它不能工作,而是因为如果你不深入了解 @State 和身份( identity )工作原理,它行为就会相当混乱。...A:实现近似行为方法是菜单中使用命令来提供相同操作。通常情况下,应该有列表让人们知道有哪些键盘快捷键可用。但是,如果这不适合你使用情况,我们会对这方面的增强请求反馈感兴趣。

12.2K20

使用 SwiftUI 为 macOS 创建类似于 App Store Connect 选择器

作为这项工作一部分,需要创建一个组件,允许用户从特定构建中添加和删除测试群组。...希望构建类似于 App Store Connect 中选择器组件,使用户体验尽可能熟悉,并在本文中,将展示如何使用 SwiftUI 为 macOS 构建了这个组件。...创建选择器组件让我们分析一下,我们有一组想要在 SwiftUI 列表中显示构建。每个构建都包含一组属性,其中之一是 betaGroups,它是一个表示构建所属测试群组结构体数组。...使用 .overlay 修改器在用户悬停在测试群组组件上时显示一个移除按钮。该按钮从构建所属测试群组列表中移除测试群组。...总结文章介绍了如何使用 SwiftUI为macOS 创建类似于 App Store Connect 选择器组件。

10710

优化 SwiftUI List 中显示大数据集响应效率

SwiftUI 视图生命周期研究[3] 一文中,对 List 如何对子视图显示进行优化做了一定介绍。...使用了 id 修饰符相当于将这些视图从 ForEach 中拆分出来,因此丧失了优化条件。 总之,当前在数据量较大情况下,应避免 List 中对 ForEach 子视图使用 id 修饰符。...虽然我们已经找到了导致进入列表视图卡顿原因,但如何在不影响效率情况下通过 scrollTo 来实现到列表端点滚动呢?...我们可以通过 ForEach 外面分别为列表端点设置显式标识来解决使用 scrollTo 滚动到指定位置问题。...生产中处理方式 本文为了演示 id 修饰符 ForEach异常状况以及问题排查思路,创建了一个在生产环境中几乎不可能使用范例。

9.1K20

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

开始 首先看下主要内容: 本教程中,您将了解如何在SwiftUI和Combine中使用VIPER体系结构模式,同时构建一个允许用户创建公路旅行iOS应用程序,来自翻译。...点击+按钮将向列表添加一个New Trip。 4. Deleting a Trip 创建旅行用户可能还希望能够删除它们,以防出错或旅行结束。既然已经创建了数据路径,向屏幕添加额外操作就很简单了。...将trip名称分隔成这样属性允许您同步该值,而不需要创建一个无限循环更新。...要使用presenter,创建一个名为TripMapView.swiftSwiftUI View。...使用presenter向列表添加新路径点add按钮。 一个列表List,它使用ForEach与presenter为每个路点创建一个单元格。

17.4K10

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

下一个任务是将黑框变成自定义视频播放器。 它目的是播放一组循环剪辑,让用户对所有这些视频感到兴奋。 然后,您需要添加一些自定义手势,例如点击打开声音和双击将其更改为 2 倍速度。...AVPlayerLayer } 为了能够 SwiftUI使用此视图,您需要使用 UIViewRepresentable 创建一个包装器。...2) 您使用初始值设定项创建 LoopingPlayerUIView 新实例并返回新实例。 3) SwiftUI 需要更新底层 UIView 时会调用此方法。 现在,将其留空。...您会在左上角看到画中画按钮……否则不会! 缺点是,撰写本文时,iOS 14.5是可用最新版本,VideoPlayer SwiftUI 视图未显示画中画按钮。...如果你想使用画中画,你需要使用 AVPlayerViewController,它属于 UIKit。 好处是你知道如何在 SwiftUI 和 UIKit 之间建立桥梁。

6.9K10

SwiftUI 与 Core Data —— 数据获取

尽管在实践中,如果能在确保访问托管对象非线程安全属性前提下,创建托管对象线程中持有托管对象并不会出现崩溃情况,但出于谨慎考虑,最终还是放弃了这种方式。... SwiftUI 中,ForEach 会根据数据标识( Identifier )自动处理视图添加、删除等操作,因此,当在 SwiftUI使用 NSFetchedResultsController...创建自定义 DynamicProperty 类型时,需要注意以下几点:可以自定义类型中使用环境值或环境对象视图被加载后,视图中所有符合 DynamicProperty 协议类型也将一并具备访问环境数据能力...当 SwiftUI 视图存续期中重新创建视图描述实例时,自定义类型也将一并重新创建在视图存续期中,如果 SwiftUI 创新创建了视图描述实例,那么无论视图描述( 符合 View 协议 Struct...这是由于一旦 SwiftUI 惰性容器中出现了多个 ForEach ,惰性容器将丧失对子视图优化能力。任何数据变动,惰性容器都将对所有的子视图进行更新而不是仅更新可见部分子视图。

4.6K30

如何结合 Core Data 和 SwiftUI

在此项目中,我们将仅使用少量 Core Data 功能,但是这种功能将很快扩展——只想首先了解一下它。...我们需要确保该获取请求随着时间推移保持最新,以便在创建删除学生时,我们 UI 保持同步。 SwiftUI 有一个解决方案,而且——您猜对了——这是另一个属性包装器。...如果我们对 Core Data 说“这不是必须”(您可以模型编辑器中完成),它仍然会生成可选 Swift 属性,因为所有 Core Data 关心是属性保存时具有值——在其他时间它们可以为 nil...为了解决这个问题,我们将在列表下方创建一个按钮,每次点击都会添加一个新随机学生,但是首先我们需要一个新属性来存储托管对象上下文。 让重申一下,因为这很重要。...现在,有趣部分是:我们将使用为我们生成 Core Data 类创建一个 Student对象。这需要附加到托管对象上下文中,以便对象知道应将其存储何处。然后,我们可以像通常为结构体那样分配值。

11.8K30

掌握 SwiftUI Safe Area

本文将探讨如何在 SwiftUI 中获取 SafeAreaInsets、将视图绘制到安全区域之外、修改视图安全区域等内容。...•all(默认)上述两种安全区域划分合集 iOS 13 并没有提供键盘自动避让功能,开发者需要编写一些额外代码来解决软键盘恰当遮盖视图( TextField )问题。...使用 safeAreaInset 扩展安全区域 SwiftUI 中,所有基于 UIScrollView 组件(ScrollView、List、Form),默认情况下都会充满整个屏幕,但仍可确保我们可以安全区域内看到所有的内容...safeAreaInsetList2 遗憾是, iOS 15 之前,SwiftUI 并没有提供调整视图安全区手段,如果我们想通过 SwiftUI 手段创建一个自定义 Tabbar 时,列表中最后内容将被...尽管使用 safeAreaInset 为列表底部添加状态栏或自定义 TabBar 非常方便,但如果你列表使用了 TextField,情况将变得很麻烦。

7.5K31

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

但是,SwiftUI一些系统控件并没有完全遵循响应式设计原则,由此某些情况下会出现严重错误,影响用户体验,并使开发者无所适从。...SheetDetailView 代码后,我们不再使用手势来取消 Sheet,而是通过点击 “Dismiss” 按钮来实现这一操作。...然而,明显地,强迫用户点击 “Dismiss” 按钮不是一个好选择,特别是没有屏蔽手势取消 Sheet 情况下。...它复现条件如下:iOS 16 系统,真机或模拟器上测试点击视图列表按钮,可以进入下一级视图。...通过自定义返回按钮以及扩展 UINavigationController 方式,实现了禁用 Back 按钮后仍支持手势返回,并先修改状态后再进行视图响应。

589110

SwiftUI 布局协议 - Part2

AnyLayout 切换布局 结语 Part 2 - 高级布局: 前言 自定义动画 双向自定义值 避免布局循环和崩溃 递归布局 布局组合 插入两个布局 使用绑定参数 一个有用调试工具 最后思考 自定义动画...= nil } 注意:称它为双向自定义值,因为信息是可以双向流动,但是,这不是 SwiftUI 官方术语,只是为了更清晰解释这个想法术语。...使用绑定参数 今年 SwfitUI Lounges 出现了一个有趣问题,询问是否可能使用布局协议去创建一个层次树,用线连接。挑战不是视图树结构,而是我们如何画连接线。...本例中,创建了两个 UUID 布局值,一个标识视图,另一个作为父视图 ID。...经常认为这些视图是理所当然,并将它们视为简单而不复杂容器,好吧,尝试编写自己版本,各种情况下复制一个 HStack ,多种类型视图和布局优先级竞争同一个空间。。。这是一个不错挑战!

2.7K30

SwiftUI 状态管理系统指南

前言 SwiftUI与苹果之前UI框架区别不仅仅在于如何定义视图和其他UI组件,还在于如何在整个使用应用程序中管理视图层级状态。...SwiftUI没有使用委托、数据源或任何其他UIKit和AppKit等命令式框架中常见状态管理模式,而是配备了一些属性包装器[1],使我们能够准确地声明我们数据如何被我们视图观察、渲染和改变。...因此,虽然下面的内容在技术上可能会被编译,但最终会导致运行时问题——因为当我们视图更新时被重新创建,UserModelController实例可能会被删除(因为我们视图现在是它主要所有者):...: SwiftUI视图不是对正在屏幕上渲染实际UI组件引用,而是描述我们UI轻量级值——因此它们没有像UIView实例那样生命周期。...尽管一个父视图和它一个子视图之间创建绑定通常很容易,但在整个视图层次结构中传递某个对象或值可能相当麻烦——而这正是环境变量旨在解决问题类型。 有两种主要方法来使用SwiftUI环境。

5K20

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

但是,SwiftUI一些系统控件并没有完全遵循响应式设计原则,由此某些情况下会出现严重错误,影响用户体验,并使开发者无所适从。...SheetDetailView 代码后,我们不再使用手势来取消 Sheet,而是通过点击 “Dismiss” 按钮来实现这一操作。...然而,明显地,强迫用户点击 “Dismiss” 按钮不是一个好选择,特别是没有屏蔽手势取消 Sheet 情况下。...它复现条件如下: iOS 16 系统,真机或模拟器上测试 点击视图列表按钮,可以进入下一级视图。...通过自定义返回按钮以及扩展 UINavigationController 方式,实现了禁用 Back 按钮后仍支持手势返回,并先修改状态后再进行视图响应。

26720

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

技术准备十多年接触代码最大担心不是知识储备不够,而是没有手感了。这个忧虑最终也得到了证实。...SwiftUI 给我创建了一个非常高效环境,短时间内便可以将整个 app 原型跑起来,但当真正地将具体实现以及数据流完全串联起来时才发现一切并不那么简单。...主要问题并不是技术方面,而是由于完全没有审核经验因此走了很多冤枉路。总之经过了一个半月开发( 其中包括半个月各种审核问题 ),第一个版本目前已登陆 App Store。...ForEach视图声明中唯一循环控制方式,控制力有待加强。如果使用 data: Range 的话,range 不可变。比如说 0.....等不下去了,删除了原来资费数据又重新创建了资费数据,提交审核资费通过。将新资费数据重新填入 app 提交中,再度被拒。原来描述中没有内购资费详细说明,修改后终于通过。

2.5K40

SwiftUI + Core Data App 内存占用优化之旅

我们创建完 100 条数据后,重启应用( 重启可以更精准地测量内存占用情况 )并滚动列表至底部。此时该应用内存占用为 1.6 GB 左右。...正常情况下( 惰性容器中仅包含一个 ForEach ,且子视图没有使用 id 添加显式标识 ),惰性容器仅会创建当前可见范围内子视图实例,并对其 body 进行求值( 渲染 )。...这意味着,惰性容器中,视图一经创建,其存续期将与该容器一致( 容器销毁,则视图将始终存续 )。...释放积极 @State 上面代码问题,是因为我们使用了声明为 @State 变量来暂存 Image。...在这种情况下,我们可以通过引用类型来创建一个 Holder,通过该持有器,解决释放积极问题。

2.4K40

SwiftUI + Core Data App 内存占用优化之旅

我们创建完 100 条数据后,重启应用( 重启可以更精准地测量内存占用情况 )并滚动列表至底部。此时该应用内存占用为 1.6 GB 左右。...正常情况下( 惰性容器中仅包含一个 ForEach ,且子视图没有使用 id 添加显式标识 ),惰性容器仅会创建当前可见范围内子视图实例,并对其 body 进行求值( 渲染 )。...这意味着,惰性容器中,视图一经创建,其存续期将与该容器一致( 容器销毁,则视图将始终存续 )。...释放积极 @State 上面代码问题,是因为我们使用了声明为 @State 变量来暂存 Image。...在这种情况下,我们可以通过引用类型来创建一个 Holder,通过该持有器,解决释放积极问题。

1.2K10

WWDC 23 ,SwiftUI 5 和 SwiftData 初印象

WWDC 2023 正在如火荼地进行。苹果不仅带来了全新形态硬件产品,还推出了几个相当震撼新框架。本文将聊聊对本届 WWDC 中 SwiftUI 5.0 和 SwiftData 初步印象。...总之,当前制约动画或视觉效果将不再是 SwiftUI 能力,而是开发者创意。...不考虑兼容旧版本情况下认为 SwiftUI 5.0 升级可以打 95 分(满分 100 分),不过考虑到很多开发者相当一段时间内还无法使用这些新功能,心情就会异常低落。...从这两天使用来看,在其功能和稳定性得到进一步改善和增强情况下,它确实会给开发者带来更多便利。...性质与通过宏创建 Observed 状态类似,可直接驱动视图更新(传递时无需使用属性包装器) Attribute 派生选项被废弃了 可以 Xcode 中使用 Model Editor 将 Model

35010
领券