如何在不同的iOS视图之间共享控制器

时间:2016-02-11 21:19:15

标签: ios uiviewcontroller

我来自C#wpf背景,您可以在其中使用一个ViewModel处理多个视图。这是在不相关的视图之间共享数据的好方法。但是我无法弄清楚如何在iOS中做同样的事情,因为你似乎需要为每个View都有一个Controller。

我想要实现的是拥有一个注册序列,用户可以逐个填充5个数据屏幕。我打算使用PageViewController进行此操作,每次单击Next都会将它们传输到序列中的下一页。一直以来,将所有输入数据添加到父模型对象中,该模型对象保留了所有五个屏幕,最后您可以将整批数据提交到数据库进行注册。

到目前为止,我能看到的唯一方法是创建五个单独的ViewControllers,每个用于注册的每个屏幕,并创建导航逻辑以在您点击时显示它们。然而,这a)似乎有点过分,b)意味着每个后续的屏幕和视图控制器都不知道用户在前面的步骤中输入的信息。

在iOS中执行此操作的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

你可以通过多种方式实现这一目标。如果您想使用UIPageViewController,您实际上可以为注册过程的所有步骤配备一个视图控制器。

主视图控制器将实现协议UIPageViewControllerDataSource。它有两个必需的方法,它们返回一个内容视图控制器的实例。这些实例可以是任何UIViewController子类,因此您可以有五个单独的视图控制器类,或者您可以有五个相同类的实例。

Xcode有一个项目模板“基于页面的应用程序”。它可能是一个很好的示例代码。有一个类DataViewController,它为每个页面实例化。如果您的案例非常简单,那么这可能是最佳解决方案。

如果使用多个视图控制器,则可以通过覆盖方法prepareForSegue(segue:sender :)来在它们之间传递数据。 UIStoryboardSegue对象可以访问目标视图控制器,您可以将其强制转换并设置属性。 (我假设你正在使用故事板和赛段。)

另一种方法是不使用UIPageViewController并在一个视图控制器中实现整个过程。可能有一个包含五个容器子视图的视图。最初会显示第一个,然后是第二个,依此类推。这需要在这些步骤之间手动实现导航,但提供了很大的灵活性。它也与MVVM更加一致,因为ViewModel和ViewController之间存在一对一的映射。

通常,iOS应用程序有很多视图控制器。在你的情况下使用五个对我来说似乎并不过分。它可能是更多的代码,但它的复杂性更低。