使用一流的对象创建具有多种单元格类型的UITableViews

问题

在AI公司工作时,您总是会做很多技术演示,以在野外使用某种技术。 现代算法往往具有很多您想尝试的参数,有时工作的结果只能由人类认可,尤其是当它与任何类型的图像处理/计算机视觉或AR / ML类型相关时应用程序,您必须用眼睛检查结果。

这通常导致必须创建一堆屏幕上的按钮/滑块,以便可以对核心逻辑进行参数设置,并查看新的超参数如何影响结果。 在进行了几次这样的演示之后,我决定创建一个自定义调试菜单,您可以在其中以声明方式添加几个选项,然后观察更改。

我一天通过分叉现有的调试工具Dotzu制作了原型 项目仍处于起步阶段,但现在或多或少可以满足我的需求。 您可以在公共仓库中使用它。 以下是取得的成果的小演示:

现在,有趣的部分。 我们创建一个UITableViewController子类,在其故事板上没有单元原型:

所有的魔力都进入了它的实现。 让我们来看看:

  1. 在最底部,我们声明要呈现的模型数组
  2. 这是最有趣的部分。 由于一流的类型对象不可比,因此我们使用Swift标准库中的 ObjectIdentifier结构为每个Type对象创建Hashable / Equatable代理对象。 我们声明一个字典和两个方便的方法来注册并从中获取类型。

由于它是重复的代码部分,因此可能应将其移至称为TypeRegister或类似名称的单独类中。

3.在viewDidLoad()方法中,我们使用一个小的辅助方法将单元格类型注册到表视图中。

4.接下来,我们将关联的Model-View对注册到我们的类型字典中。

5.在cellForRowAt中:我们从数组中获得一个模型,为其确定一个单元格类型,并出列适当类型的单元格。

6.最后,我们告诉UITableView使用自动布局来计算单元格的高度,因为它可以从一个选项到另一个选项。

而已! 现在,您有了UITableView的60行代码的超灵活实现,可以处理其中无限数量的模型。

用法

框架的使用非常简单。 您所要做的就是通过调用一种方法来一次初始化调试菜单(通常在AppDelegate中):

DebugMenu.sharedManager.enable()

然后以声明的方式声明您的选项(通常在控制器的viewDidLoad中 ):

通话开始的结果可以在故事开始的视频中看到

由于该仓库专用于调试,因此您可能希望使用#if DEBUG…#endif子句覆盖与DebugMenu的所有交互。

最后的话

由于UI工程不是我每天都会做的事情,因此,我很想听听您对这项技术的反馈,并希望听到关于如何做得更好的任何指导。 希望您喜欢阅读!

不要忘了在GitHub上使用仓库,并在Twitter上关注我。