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

问题描述:

我来自一个C#wpf背景,您可以让一个ViewModel处理多个视图。这是在无关的观点之间共享数据的好方法。但是我不知道如何在iOS中做同样的事情,因为您似乎需要每个View的Controller。如何在不同的iOS视图之间共享控制器

我试图实现的是有一个注册序列,用户一个接一个地填充5个屏幕的数据。我将为此使用PageViewController,并且每次点击Next时都会将它们转移到序列中的下一页。一直以来,将所有输入数据添加到一个父模型对象,该模型对象保留所有五个屏幕,最后,您可以将全部数据提交给数据库进行注册。

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

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

你可以用很多方式做到这一点。如果你喜欢使用UIPageViewController,你实际上可以有一个视图控制器用于注册过程的所有步骤。

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

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

如果您使用多个视图控制器,您可以通过重写方法prepareForSegue(segue:sender :)来在它们之间传递数据。 UIStoryboardSegue对象可以访问目标视图控制器,您可以投射它并设置属性。 (我假设你正在使用storyboard和segues。)

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

一般来说,iOS应用程序有很多视图控制器。对我来说,在你的案例中使用五个似乎并不是一件太过矫枉过正的事情。这可能是更多的代码,但它不那么复杂。

+0

非常好,非常感谢。就像旁边,两个快速跟进。如果我使用PageViewControllerDataSource,是否有手动导航和禁用滑动的方法?我只希望导航由按钮点击驱动。第二,是否有一种方法可以让您在多个分页屏幕上看到这些页面索引点,这些页面会显示您所在集合的哪个页面?我在Apple TV部分看到了一个PageController控件,但我只想为基本iOS应用程序提供相同的功能。再次感谢! – NZJames

+0

请参阅[此答案](http://*.com/a/24847685/5917586)。 –