【问题标题】:What's the best way to present different modes in one UIViewController? [closed]在一个 UIViewController 中呈现不同模式的最佳方式是什么? [关闭]
【发布时间】:2021-12-25 21:30:59
【问题描述】:

我需要实现一个屏幕,列出我从 API 接收的数据。有一个mode 导航栏按钮,用于更改数据在同一屏幕(同一视图控制器)中的显示方式

在末尾添加了一个 gif 以便于可视化。我的概念很相似,但不需要过渡动画。

任务本身非常简单,但我无法确定处理此“模式切换”的最佳方法是什么。我想出了以下选项。

选项 1:每种模式有 2 个不同的视图控制器。 ContainerVC 持有一个状态,并在模式切换时更改 childVC。我认为这是数据不同时的最佳方法 - 例如在分段控制中。由于在我的情况下,两个子视图控制器中使用的数据相同,因此管理它可能会有问题。

选项 2:我们为每种模式提供 2 个不同的视图(例如 tableView - mapView),我们根据在同一视图控制器中选择的模式添加/删除这些子视图。使用这种方法,我的视图控制器很容易变得庞大且无法在心跳中维护

选项 3:类似于选项 2,但不是添加/删除,而是显示/隐藏其中一个视图。

我不确定是否有其他方法可以提供更简洁的方法来解决此问题,我很乐意阅读资源/文档以阅读您的分享

【问题讨论】:

    标签: ios swift uiviewcontroller


    【解决方案1】:

    如果只有视图的位置发生变化,您只需更新约束即可。如果视图因模式而完全不同,出于性能原因,我肯定会使用容器视图控制器而不是隐藏/显示视图。您可以将两个视图控制器(每个视图控制器管理单个模式的视图)存储在容器属性中,当模式更改时容器切换可见 clild(删除当前子视图及其视图,然后将另一个视图控制器放入层次结构)。我建议你把数据只存储在容器中,然后你可以将容器引用传递给孩子(可能在初始化期间),这样孩子就可以通过容器访问相同的模型数据,这样可以避免重复或冲突。

    否则,您还可以将单个视图控制器与模式更改时调用的方法一起使用。在该方法中,您可以简单地删除当前视图(不仅仅是隐藏它们)并插入其他视图。

    【讨论】:

    • 感谢您的回答!您是否介意共享一个资源来验证您的性能原因声明“我肯定会使用容器视图控制器,而不是出于性能原因隐藏/显示视图”
    • @mamba4ever 答案没问题。如果您隐藏视图而不是从层次结构中删除它,它仍然会涉及绘图系统,如果有很多隐藏视图会影响性能,请查看this question。其次,观点存在于记忆中。我建议你试试你的方法,看看 UI 是否流畅(很可能,至少在不涉及很多视图的情况下)。
    猜你喜欢
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    相关资源
    最近更新 更多