大多数浏览器和
Developer App 均支持流媒体播放。
-
在 SwiftUI 中精心打造搜索体验
了解如何帮助人们在您的 app 中快速找到特定内容。了解如何将 SwiftUI 的 .searchable 修饰符与其他视图结合使用,以最好地整合 app 的搜索。我们还将展示如何通过提供搜索建议来帮助人们了解他们可以执行的搜索类型,从而提升执行体验。
资源
相关视频
WWDC21
-
下载
♪ ♪ 我是哈利 SwiftUI团队的程序员 欢迎来到打造SwiftUI搜索体验 SwiftUI搜索功能是全新功能 我等不及跟你们分享 要如何使用这些功能 有时候你会想在App里面 搜寻特定的东西 但很多App里面 有许多数据采集 所以很难找到 你需要找的东西 有可能是要找最新的App趋势 找下一首歌 或早上通勤时 想找播客来听 使用搜索功能 就能解决这些问题 最佳的搜索体验 会因为App的结构与内容而有不同 但通常来说 所有体验会包含 一个定义搜索查询的搜索栏 现在可以直接在SwiftUI里搜索 让我展示给你们看 在这次讲解 我会介绍全新的searchable修饰符 这修饰符构成了SwiftUI中 所有搜索功能的基础 我会展示导航栏是如何结合 searchable修饰符 最后 我会通过新增搜索建议来解释 如何延伸searchable修饰符的功能 Searchable在SwiftUI里 是全新的视图修饰符 在各个平台都能用 它能让视图内容 被搜索得到 内容会决定其定义 在这段发表 我会通过范例来介绍 这个修饰符如何用在各个平台 为了更了解这个修饰符 我们以天气为范例 在iOS里最好的范例就是 最新查询天气用的App 当你查看城市列表的时候 你可以在搜索栏打字 这样就能在清单上新增城市 为了展示天气App是如何利用 searchable修饰符 来加强天气App的功能 我们来拆解它的UI结构 天气App是从导航栏开始的 所以会有一个浏览框 之后再加上定制列表 作为导航栏的内容 在列表中 会在cells前面 多加一条ForEach 最后 在天气App的导航栏 增加searchable修饰符 所有searchable修饰符的核心就是 搜索栏的设置 searchable修饰符控制着 设定好的搜索栏 并延伸下去 通过环境让每个平台的视图 都能通过最好的方法被使用 导航栏能读到搜索的区块 并将它呈现为搜索栏 如果没有视图使用配置好的搜索栏 searchable修饰符就会在工具栏中 呈现搜索栏的默认选项 搜索栏通常不是唯一跟UI搜索功能 有关系的部分 呈现某种形式的搜索结果 是很常见的设计模式 天气App就是照着这个模式 只要看到搜索查询有数据输入 它就会呈现其他列表来换掉定制列表 更换的内容包含最新搜索问题的结果 我们来看天气App 是如何通过searchable修饰符 提供的数据来完成这项UI 这是天气App的定制表单 Searchable修饰符建立的新环境属性 称作isSearching 天气App会用它来 动态式调整呈现出的视图 并根据用户是否正在搜索而做调整 天气App会查找isSearching环境属性 以及搜索的内容 有条件式地呈现搜索结果 呈现自己的结果时 不妨使用覆盖 如此一来 用户搜寻完并回上一页后 主UI的状态就不会被更动 现在来多聊聊 导航栏是如何结合 新的searchable修饰符 在开始之前 我想先介绍一款 我千辛万苦开发出来的App 我称它为Colors 这个App让用户能够管理 自己喜欢的颜色库 称做调色盘 你或许想替你背景换点不同颜色 替你App主题换颜色 或只是想帮你新的M1 iMac选新颜色 无论想做什么 Colors这款App都能满足你需求 Colors的基础架构是两列导航栏 其中第一列的根视图 在iPadOS跟macOS上是侧边栏 而在其他平台上会是导航堆叠的基础 在侧边栏 你会看到我的调色库 在仔细看的话 你会看到 被选起来的调色库 你也能看到这些颜色 呈现在用户设备时 会有的色差 大家开始用App的时候 我就注意到 大家喜欢各式各样的颜色 他们会一直在自己的颜色库新增颜色 但当颜色库的颜色越多 就越难找到 特定要找的色盘 大家都会需要 看完整个颜色库才能找到需要的色盘 所以 我决定要增加 搜索的功能 我希望此功能可以跟寻平台的习惯 这样大家在用我的App时 就会马上理解操作 现在来看看 我是如何使用 searchable修饰符来执行此功能
这个是我写的导航栏 也是Colors这个App里的一部分 为了要有搜索功能 我在导航栏里面加了 searchable修饰符 按照惯例 我会编写一个binding 用来支持搜索功能 这在iOS跟iPadOS上面 会呈现为搜索栏 当导航栏涵盖在 searchable修饰符的内容里 其中一个字段就会是搜索栏 哪个栏位会被使用 取决于导航栏上有几个栏位 因为我导航栏是两栏式 我的搜索栏位会出现在侧边栏 在iOS跟iPados都一样 如果你希望搜索栏位 不是出现在默认的栏位 那你就要在你想要的栏位 输入searchable修饰符 道理就跟现存的工具栏修饰符一样 在这款App上 我会将searchable 输入在导航栏的地方 就像天气App 我会用isSearching环境属性 让搜索的结果 动态式呈现在侧边栏 macOS上的searchable修饰符 会让搜索栏出现在 工具栏最多空间延伸的地方 来因应平台上会有的预期行为 像是窗口缩小时会跟着自动引缩 我会将我搜索结果 呈现在App详细资料窗格里 为了就是要在macOS上提供 更佳的体验 watchOS呈现方式跟iOS差不多 在watchOS工具栏正上方也有搜索栏 SwiftUI选择在第一栏位置 呈现搜索栏 你可以注意到我没有为了不同的行为 在不同平台上 改变searchable修饰符的位置 我App的架构在这些平台都一样 都维持两栏式导航栏 SwiftUI可以辨识这种架构 以及不同平台的习惯 所以它自己会帮我处理好这些工作 我在看Apple tvOS的时候 我发现我App的架构 在其他平台上还有进步空间 搜索栏在Apple tvOS 常会以标签页呈现 但我的App没有标签页视图 只要做些调整 我的App就能解决这问题 不需要呈现出两栏式导航栏 我就能提供更具tvOS特色的体验 我只需要单栏式导航栏 并将标签页做为导航栏的视图内容 在标签页视图中 我会沿用现存侧边栏 再新增一个搜索栏 搜索栏代表了占位视图 被第一次浏览该栏位的人 看到的样子 最后 我会将searchable搜索栏 移到导航栏区块来包装程序代码 当搜索栏收到输入的搜索数据后 就会直接显示出搜索结果 我将搜索功能导入每个平台上 因为SwiftUI有宣告式的特点 所以我App的导航结构可以保持一致 我可以依赖SwiftUI 并让searchable修饰符 自动帮特定的导航结构 选择最合适的界面 我App的结构在tvOS上会改变 我把在searchable修饰符学到的 应用在不同的结构上 只有我定义为“searchable”的内容 才会随着该结构改变 现在你有了searchable修饰符的知识 我们准备讲最后一个主题 那就是搜索建议 用过我App搜索功能后 有用户反应 虽然他们很喜欢搜索功能 但有时候会不清楚 他们可以搜索哪些东西 很多App会提供搜索建议给用户 让用户知道有哪些问题可以搜索 这些建议代表了完整的搜索查询 例如在macOS 搜索建议会出现在菜单上 在iOS上 会出现代表列表的按钮 在watchOS上则是一整个列表 搜索建议可以让用户 知道有哪些东西可以搜索 SwiftUI提供简单的方法 让你能在App上新增搜索建议 让我们来瞧瞧 观察我的App 你可以发现到 我在searchable修饰符多加了text Searchable修饰词提供选择性参数 这参数就是我列的suggestions 我会提供新的视图给suggestions参数 可能是一些静态的按钮 或更有可能是ForEach 并且是来自我App数据库 或服务器的suggestions SwiftUI能读取这视图 并且会根据 是否有建议可以给 才来呈现搜索建议 以watchOS为例 当你输入信息 就会出现搜索栏的图像 最常见的模式就是 提供一个ForEach按钮 有互动之后就会更新 提供给searchable修饰符的 text binding 以及搜索建议的文本值 事实上 我们希望能普及化这模式 因此新增了search completion修饰词 你可以在非互动式的视图 使用search completion修饰符 它会将视图转成按钮 并更新搜索内容 以及删掉最新建议 如果你在开发App 而用户会先根据搜索建议互动 并用来取得更完整的搜索结果 你可以考虑 使用新的onSubmit修饰符 来知道何时给搜索结果 并将搜索值传给onSubmit 这样当用户提交搜索查询时 你提供的闭包就会被启用 这情况通常会出现在 用户选取搜索建议时 或是用户在硬件输入设备 按下了Enter键 你可以将与搜索无关的提交 使用新的onSubmit修饰符 来结合文字输入格或安全栏位 搭配search completion修饰符 并使用suggestions参数 可以简易帮你App提供一个 有效又简单的搜索建议功能 希望你们会喜欢这段在讲 SwiftUI能提供的搜索功能 的相关介绍 总之 searchable修饰符能让你 将视图内容变成搜索得到的信息 导航栏与searchable修饰符结合 根据导航栏的内容 提供最适合平台的体验 利用isSearching环境性质 让用户在搜索的时候 你App的UI可以动态式改变内容 利用search completion修饰符 以及searchable修饰符的 suggestions参数 在你的App里增加搜索建议 你现在可以开始 在所有的SwfitUI App里 增加搜索功能了 祝你们大会愉快 [音乐]
-
-
0:10 - Colors Suggestions
struct ColorsContentView: View { @State var text = "" var body: some View { NavigationView { Sidebar() DetailView() } .searchable(text: $text) { ForEach(suggestions) { suggestion in Button { text = suggestion.text } label: { ColorsSuggestionLabel(suggestion) } } } } }
-
1:17 - New Searchable Modifier
ContentView() .searchable(text: $text)
-
1:58 - Weather Search
NavigationView { WeatherList(text: $text) { ForEach(data) { item in WeatherCell(item) } } } .searchable(text: $text)
-
3:11 - Weather List
struct WeatherList: View { @Binding var text: String @Environment(\.isSearching) private var isSearching: Bool var body: some View { WeatherCitiesList() .overlay { if isSearching && !text.isEmpty { WeatherSearchResults() } } } }
-
5:07 - Colors Search
struct ColorsContentView: View { @State var text = "" var body: some View { NavigationView { Sidebar() DetailView() } .searchable(text: $text) } }
-
7:15 - Colors Search with TV
struct ColorsContentView: View { @State var text = "" var body: some View { NavigationView { #if os(tvOS) TabView { Sidebar() ColorsSearch() .searchable(text: $text) } #else Sidebar() DetailView() #endif } #if !os(tvOS) .searchable(text: $text) #endif } }
-
9:09 - Colors Search Completions
struct ColorsContentView: View { @State var text = "" var body: some View { NavigationView { Sidebar() DetailView() } .searchable(text: $text) { ForEach(suggestions) { suggestion in ColorsSuggestionLabel(suggestion) .searchCompletion(suggestion.text) } } } }
-
10:21 - On Submit
ContentView() .searchable(text: $text) { MySearchSuggestions() } .onSubmit(of: .search) { fetchResults() }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。