多个视图控制器上的相同 UIProgressView

Same UIProgressView Over Multiple View Controllers

前言

我有一个 iOS 申请,注册过程有两页。

我在每个页面上安装了一个 UIProgressView 来衡量用户在上述注册过程中的累积进度。

目前注册流程包括六个字段。

现有的 UIProgressView 在文本字段完成编辑时采用基于 1 / 6 更新的浮动输入。

第一个控制器的 UIProgressView 以零浮点值启动。

完成所有字段后;第二个视图控制器以 0.5 的浮点值启动。

问题

这个解决方案很原始,问题也很多。

对于初学者,您可以在展开/转场期间看到两个 UIProgressView。

问题

我可以在两个视图控制器中使用相同的 UIProgressView 吗?

预先感谢您的帮助。

NB

上述注册过程由两个独立的视图控制器组成。请告知这是否是常见做法/是否存在更合适的解决方案。

主要问题图片

解决上图中所示的问题是我的首要任务objective。

根据我的意见,为两个控制器创建两个单独的 UIProgressView

你所要做的就是发挥它的价值。这里重要的是数据而不是 UI。我的意思是,如果您想显示进度已完成一半。这可以通过在下一个控制器中创建一个新的 UIProgressView 控件来实现,因为最终控件中的数据更改 UI 将是相同的。

因此,当您在第一个视图控制器上完成完成过程时,将第一个进度控件的值传递给第二个视图控制器,并基于该值创建第二个进度控件。

如果您不知道如何在两个视图控制器之间传递数据, 会对您有所帮助。

但是,如果您不愿意在两个不同的控制器上创建两个单独的进度,则可以将进度控件添加为根控制器 window 中的子视图。这样它将为所有控制器共享一个公共屏幕,并在整个应用程序中保持在顶部。

var appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
appDelegate.window?.addSubview(progressView)

如果您希望进度条在用户完成您的 2 次注册时保持固定 VC,请使用视图控制器包含。

创建一个 parent 视图控制器,其中包含进度视图和一个容器视图以保存 2 个注册 VC 之一。使用嵌入 segue link 将容器视图 child 视图控制器。如果愿意,您可以将 child 视图控制器设为导航控制器,或者您可以简单地嵌入第一个注册 VC,然后根据需要在第一个和第二个之间制作动画。

编辑: 有一个方法叫做 transitionFromViewController:toViewController:duration:options:animations:completion: 让您可以轻松地在 child 视图控制器之间创建转换。

第二次编辑:如果你需要在parent视图控制器和child视图控制器之间进行通信,你必须连接起来一种自己做的方法。要从 child 返回到 parent,通常的方法是在 child 中设置一个委托 属性 并定义一个简单的协议来返回到 parent parent。在 parent 的 prepareForSegue 方法中,您将 child 的委托 属性 设置为 self。 child 然后可以根据需要向 parent 发送消息。

在你的情况下,你会定义一个简单的协议,让 child 通知 parent 关于进度值的更改,然后 parent 会更新进度看法。 (让 child 视图控制器直接操作进度视图是个坏主意。)

如果你想让 parent 与 child 通信,那么你需要在设置时保存指向 child 视图控制器的指针,类似于设置一个代表。

如果换出 child 视图控制器,那么您将需要设置管道(child-to-parent 委托 属性 和 parent-to-child 指针)作为交换 child 视图控制器的代码。

我在 gitHub 上有一个项目,其名称真的很糟糕“test”(link),它设置了一个 parent 和 child 视图控制器,以及从 parent 到 child 和从 child 到 parent 的通信。

在这里为像我一样认为应该有更简单的解决方案的其他人添加另一个答案,尤其是在入职流程场景中使用。

对于包含五步入职的示例场景,我的方法是:

  • 在流程中的每个 VC 上添加一个进度条。
  • 第一个进度条,在Storyboard中设置progress为0.2即可
  • 对于第二个,在 viewDidLoad 中,首先将进度条设置为 0.2:yourProgressBar.progress = 0.2
  • 然后就在下面:let dispatchTime = DispatchTime.now() + 0.01 DispatchQueue.main.asyncAfter(deadline:dispatchTime, execute: { self.onboardingProgress.setProgress(0.4, animated: true)})
  • 以 0.2 的增量重复入职的每个新步骤。

Dispatch Queue 允许进度条设置为之前 VC 的进度,然后动画显示新的进度。如果没有 DispatchQueue,整个进度条会在加载 VC 时从头开始动画,完全破坏预期的效果。

希望对大家有所帮助!