自动进行复杂的表格视图状态更改

这不是我的编程博客,但我无法抗拒发表此帖子。 我想为正在处理复杂(尤其是动态)表视图布局的iOS程序员提供帮助。 我也喜欢Kitchen Stories应用程序,很高兴看到他们在iOS开发中发表的帖子。 他们做登录屏幕的方式对我来说似乎很棒。 不过,还有改进的空间。

处理动态布局可能很困难。 这就是为什么发明了诸如响应式功能编程 (或FRP)之类的技术的原因。 如果您不知道什么是FRP,我建议您先看Ash Furrow的精彩演讲。 基本思想是,您以称为Observable 的值流的形式定义所有内容 它可以包含任何内容:用户输入的文本,API的响应,通知。 您可以通过组合和绑定这些可观察对象来编写代码。

这些硬布局的一种情况是动态表视图。 关于它们的讨厌的事情是表具有状态 。 这意味着,如果要对表进行更改(并且希望这些更改看起来很整洁),则必须手动删除并插入行和节。 想象一下,您的表有很多状态。 您必须为状态之间的每个过渡指定插入和删除。 kes

厨房的故事做出了正确的决定,并使用了一个库来帮助他们自动计算两种状态之间的差异。 让我印象最深的一件事是,他们已经定义了声明式的状态,但仍然以命令式的方式对他们的观点进行操作。 但是,为什么不更进一步呢? 为什么我们必须编写所有这些deleteRowsAtIndexPath

我将使用RxSwift和RxDataSources的功能来实现一个解决方案。 第一个是Swift中FRP的实现,第二个是使用表视图和集合视图执行复杂操作的库。

给我看看代码!

好的,首先让我们在表格视图中显示一些东西 。 如果只想显示相同的数据会更容易,但是在这种情况下,我们必须对其进行动画处理,因此我们将不得不编写一些样板来定义我们的部分。

是时候弄脏我们的双手了!

是的,它有效! 我保证,我们仍然没有更改tableView,但是我们真的很接近。 我们现在要做的是1)定义状态 表视图中的2)提供了在它们之间切换的方法,3)将状态绑定到我们的表示形式。 做吧,这很容易! 首先是状态。

看起来确实如此! 但是等等,动画不是我们想要的。 让我们修复它。

看起来更好。 我们还希望显示正确的按钮标题,因此我们也要这样做以提高我们的反应能力。

是的,它有效! 恭喜,我们做到了。 在枚举中定义状态有一件很棒的事情:如果添加更多状态,则也将不得不更改变量定义,并且您不会错过任何事情。

您可以在这里做很多事情。 我们没有更改注册/登录按钮的标题,可能应该使用关联的值来完成,因此我们的枚举不再具有原始值。 我还将在实际应用程序中使用Drivers而不是Observables (它是用于开发UI的特殊Observable,您可以在此处阅读有关它们的信息)。 另外,您可以实施即时表单验证并相应地启用/禁用按钮。 使用FRP是一项非常容易的任务!

在这个简单的教程中,Rx似乎是一个过大的功能,但是我可以向您保证,我正在做非常复杂的表视图并进行了许多更改,直到使用RxDataSources时我才失败。 在您的武器库中拥有强大的功能。

希望您喜欢本教程,并且不要害怕使用FRP。 您需要一些时间来习惯它,但是随着您变得更好,您将学习如何使用这种黑魔法

您可以在此处获取源代码。

如果您对更多教程感兴趣,请访问RxSwift存储库,ReactiveX网站,一种出色的可视化工具和一个超棒的博客。 我也很高兴在这里或我的Twitter上听到问题或建议。