【问题标题】:How to manage multi-view apps without segues如何在没有 segues 的情况下管理多视图应用程序
【发布时间】:2019-11-27 04:22:45
【问题描述】:

我正在开发一个应用程序,它有大约 5-6 个不同的视图,每个视图中都有输入和按钮。用户不必按照设定的顺序浏览视图。其中一个视图具有相当多的自定义用户交互,随后构建了文本字段和标签的可视列表。我需要用户能够离开该视图,然后在稍后返回完整的构造视觉对象。

为了避免使用单一的视图控制器,我让每个视图对应于它自己的视图控制器和情节提要。因此,我能找到在它们之间导航的唯一主要方式是通过 segues。问题是,在我关闭 segue 后,当我返回到该视图控制器时,该视图控制器的任何交互或视图更新都会丢失。

一些视图只有几个文本字段之类的输入,但一个视图可以有超过 100 多个混合输入,具体取决于用户交互。我希望找到一种方法来隐藏和显示视图控制器,而不会丢失视图中的视觉更新,而不是尝试在关闭时传递这些数据,然后最终重新加载和重建视图。

这可能吗?

如果我太含糊,请告诉我,我可以尝试提供更多细节。

提前致谢!

【问题讨论】:

  • 这可能是 MCV 的“模型”部分的用武之地。与其依赖控制器在解除后保持不变,不如使用某种模型来根据需要存储和恢复状态跨度>
  • 你需要使用一些设计模式和一些架构,否则你的代码将无法重用,现在你的想法可能是这样的,看看(stackoverflow.com/questions/48562017/…)

标签: ios swift


【解决方案1】:

您不必使用 segues 来显示故事板中的视图控制器。

您可以只加载情节提要,实例化视图控制器,然后使用它(推送或呈现它,甚至将其设置为关键窗口的根视图控制器)。没问题:

// Suppose you have a 'Signup.storyboard' that has an initial viewController defined:

let signupStoryboard = UIStoryboard(name: "Signup", bundle: nil)
if let signupViewController = signupStoryboard.instantiateInitialViewController() {
    present(signupViewController, animated: true, completion: nil)
}

如果您要加载的视图控制器不是初始视图控制器,请确保为它定义故事板标识符(在故事板中,例如 identifier="signup")。然后使用:

let signupViewController = signupStoryboard.instantiateViewController(identifier: "signup")

视图控制器将从相应的故事板加载,您可以像使用任何其他视图控制器一样使用它。

您甚至可以保留对控制器的强引用,并在其他视图控制器可见后再次重用它们。

【讨论】:

  • 感谢您的快速回复!我也尝试过这种方法,但是除非我做错了什么,否则每次我返回时它仍然会重新加载视图控制器,从而删除以前访问的所有进度。这是一个正确的假设吗?
  • @brustj 每次调用instantiateInitialViewController()instantiateViewController(identifier:) 都会返回一个新的。确实如此。但是您只能调用该方法一次,然后将视图控制器实例保存在数据模型中的某个位置,然后再重新使用同一个实例。但请注意,这可能不是保留 UI 状态的最节省内存的方式。
  • 好的,是的,这是有道理的。似乎是一种不太理想的方法,所以我会把它放在我的后口袋里,以防没有其他东西浮出水面。感谢您的帮助!
【解决方案2】:

对于每个视图控制器,您需要管理其数据源并在用户更改 UI 中的数据时进行更新。您还必须将数据源存储在某处,即数据库、用户默认值、核心数据等。 如果用户再次推送任何视图控制器,则从其数据源加载数据以查看保留的最后更改。 您可以为此使用一些设计和架构模式。 链接在这里 https://medium.com/ios-os-x-development/ios-architecture-patterns-ecba4c38de52

希望这会有所帮助。

【讨论】:

  • 我完全同意,在理想的世界中,我只会使用标准的 MVC 方法。对于简单的应用程序,这完全有道理,但在我的情况下,考虑到视图控制器需要渲染然后根据当前模型管理一堆文本字段和标签,它变得有点复杂。如果这是说 React,我会确切地知道如何做到这一点,但我发现很难翻译成 OOP。听起来我只需要重新考虑我的模型以及如何完全渲染视图及其所有自定义元素,只需阅读该模型即可。不会很容易,但不确定我还有其他选择。谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-11-29
  • 2014-10-21
  • 1970-01-01
  • 2011-11-03
  • 2012-08-28
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
相关资源
最近更新 更多