Skip to content

第91天 项目 17 第六部分

另一个应用程序完成了,现在是时候回顾你所学的知识,并接受一些挑战,以确保你真正理解所涵盖的内容——这两件事很容易被忽略,但却是实现高效学习的核心。

美国总统约翰·F·肯尼迪曾说过:“事情不会自行发生——事情是靠人去促成的”,这句话道出了这些挑战的核心。你需要主动行动,自己编写代码——亲自促成事情的发生——否则你所拥有的只是一个想法。正如史蒂夫·乔布斯所说:“没有行动的想法不是想法,而是遗憾。”

今天,你应该完成第17个项目的总结章节,完成相关复习,然后攻克所有三个挑战。

  • Flashzilla:总结
  • 第17个项目复习:Flashzilla

Flashzilla:总结

作者:Paul Hudson 2024年4月11日

这又是一个大型项目,但同时也是一个让我们学到了许多出色技术的项目,比如手势、命中测试、计时器等等。当这些功能协同工作时,我们可以在应用程序中实现出色的功能,为用户提供流畅且愉悦的体验。

你也再次认识到确保应用程序可访问性的重要性。我们很容易沉迷于酷炫的手势等功能,但随后却忘记,偏离标准用户界面(UI)也意味着我们需要在语音朗读(VoiceOver)等方面更加努力。任何人都能想出好点子,但要打造一款出色的应用程序,就必须考虑到所有人的需求。

回顾所学内容

任何人都能看完一个教程,但要记住所学的知识则需要实际付出努力。我的职责是确保你能从这些教程中收获尽可能多的知识,完成后面的练习题可以帮助你检验自己的学习成果。

挑战

学习的最佳方式之一就是尽可能多地自己编写代码,因此我提供了一些扩展该应用程序的方向,以确保你完全理解其中的原理。

  1. 添加卡片时,文本框会保留当前输入的文本。请修复此问题,让文本框在添加卡片后自动清空。
  2. 如果你将一张卡片向右拖动,但拖动距离不足以将其移除,然后松开手指,会看到卡片在滑回中心的过程中变成红色。这是为什么?该如何修复?(提示:思考我们立即将offset设回0的方式,即使卡片尚未完成动画。你可以使用三元运算符嵌套来解决此问题,但自定义修饰符会更简洁。)
  3. 更有难度的挑战:当用户答错问题时,将该卡片重新添加到数组中,以便用户再次尝试。要成功实现此功能,需要重新考虑ForEach循环,因为仅依赖简单的整数是不够的——你的卡片需要具有唯一标识。

还想尝试更多挑战?可以通过以下两种方式升级我们的加载和保存代码:

  1. 采用另一种数据保存方式,例如使用文档JSON而非UserDefaults,或者使用SwiftData——这通常是个不错的主意,你应该借此机会练习。
  2. 尝试找到一种集中管理卡片加载和保存代码的方法。你可能需要进行一些尝试,以找到自己满意的方案!

【练习题】Flashzilla

问题1/12:以下哪些表述是正确的?

  • 选项1:有多种手势都提供了onChanged()和onEnded()修饰符供我们使用。
  • 选项2:带有轻触手势的视图会自动获得isButton可访问性特征。

问题2/12:以下哪些表述是正确的?

  • 选项1:为模型数据添加example属性用于原型设计和预览是个不错的主意。
  • 选项2:语音朗读(VoiceOver)功能允许用户通过语音控制设备。

问题3/12:以下哪些表述是正确的?

  • 选项1:sequenced(before:)修饰符可用于创建手势链。
  • 选项2:启用“减少动态效果”(Reduce Motion)后,我们应禁用所有动画。

问题4/12:以下哪些表述是正确的?

  • 选项1:Combine框架已内置在SwiftUI中。
  • 选项2:当allowsHitTesting()设为false时,视图无法被轻触。

问题5/12:以下哪些表述是正确的?

  • 选项1:读取.accessibilityDifferentiateWithoutColor环境键可以为色盲用户添加额外的可访问性支持。
  • 选项2:默认情况下,NavigationStack在横屏模式下无法工作。

问题6/12:以下哪些表述是正确的?

  • 选项1:我们应使用Image(decorative:)初始化器创建重要图片,以便语音朗读(VoiceOver)知道要大声朗读这些图片的内容。
  • 选项2:计时器在默认情况下会在应用进入后台时暂停。

问题7/12:以下哪些表述是正确的?

  • 选项1:当应用程序切换到后台时,scenePhase环境值会更新。
  • 选项2:每当用户旋转设备时,scenePhase都会发生变化。

问题8/12:以下哪些表述是正确的?

  • 选项1:结构体初始化器可以将闭包作为参数。
  • 选项2:计时器一旦启动,就无法停止。

问题9/12:以下哪些表述是正确的?

  • 选项1:在Xcode中,项目(projects)和目标(targets)是同一个概念。
  • 选项2:我们可以使用onReceive()从Combine发布者(publisher)接收值。

问题10/12:以下哪些表述是正确的?

  • 选项1:contentShape()允许我们控制视图的轻触区域。
  • 选项2:计时器会在应用程序切换到后台时自动暂停。

问题11/12:以下哪些表述是正确的?

  • 选项1:计时器容差(timer tolerance)允许iOS为提高能效而延迟计时器。
  • 选项2:abs()函数在输入数字为绝对零时返回true。

问题12/12:以下哪些表述是正确的?

  • 选项1:init(repeating:count:)会重复同一个值多次,以创建一个数组。
  • 选项2:我们无法判断工作表(sheet)何时被关闭。

本站使用 VitePress 制作