运行时中的动态TabBar项-iOS(Swift)

假设您有一个同时提供免费和高级内容的应用程序。 显然,您不希望免费用户访问针对高级用户的内容。

例如,我们正在向用户提供在线视频课程。 免费用户可以访问和流媒体免费视频。 高级用户可以流式传输所有视频,下载视频,访问社区论坛并提出问题与解答。

根据用户的计划,我们有一个API可以提供该用户可用的功能列表。 例如,考虑API的JSON响应如下所示。

JSON响应(免费用户):

  { 
“计划”:“免费”,
“功能”:[“视频”,“个人资料”]
}

JSON响应(高级用户):

  { 
“ plan”:“ PAID”,
“功能”:[“视频”,“论坛”,
“下载”,
“轮廓”
]
}

解析完上述JSON响应后,我们将获得功能列表。 然后,我们将迭代并将不同的TabBar项目添加到UITabBarController。

让我们创建一个枚举来定义一组功能。 这提供了当前版本应用程序的所有可用功能。

 枚举功能:字符串{ 
案例视频=“视频”
案例下载=“下载”
案例论坛=“ FORUMS”
案例档案=“ PROFILE”
}

现在,我们从JSON响应中获得了免费用户和付费用户的功能列表。 让我们开始迭代视图控制器以显示在UITabBarController中。

为所有功能选项卡加载视图控制器

上面的代码似乎有很多字符串和重复的代码。 我们可以通过涉及一种新类型来重构它。 让我们创建一个TabItem类型来封装所有信息,并使它看起来更干净。

提取常用属性以显示“选项卡项目”

使用TabItem类型,我们将所有字符串提取到一个类型中,并创建了静态TabItem以定义不同的选项卡。 另外,我包括了order属性,以使选项卡项保持我们想要的顺序。

我还在TabItem中添加了一个辅助方法,以从相应的故事板上加载视图控制器。

加载“功能”选项卡的视图控制器的助手方法

使用上述方法,我们可以将TabItem类型转换为要加载的ViewController。 这将有助于消除重复的代码。

加载用于运行时功能列表的所有视图控制器的超级简单方法。

将所有TabItem添加到数组中之后,我使用顺序对其进行了排序,还将它们转换为ViewController。

而已。 我们完了。 多田!! 🎉

改进之处:

  • 无需对ViewControllers名称进行硬编码,我们可以按照我在此处说明的方式从类型中提取:https://medium.com/@dinaraja/load-view-controllers-effortless-swift-dd49f11f1d99
  • 我们可以将故事板名称转换为枚举,以防止使用字符串硬编码。
  • 如果您可以对资产遵循严格的命名约定,那么我们可以为普通图像和选定图像生成标签栏图像名称。

希望这会有所帮助。 如果值得一读,请注明。