PREAMBLE
我有一个带有两页注册过程的iOS应用程序。
我已在每个页面上安装了UIProgressView,以衡量所述注册过程中用户的累积进度。
目前注册过程包括六个领域。
当文本字段完成编辑时,现有的UIProgressView采用基于1/6更新的浮点输入。
第一个控制器的UIProgressView以浮点值零启动。
所有字段完成后;第二个视图控制器以浮点值0.5启动。
问题
这个解决方案很原始,问题很多。
对于初学者,你可以在展开/隔离期间看到两个UIProgressView。
问题
我是否可以跨两个视图控制器使用相同的UIProgressView?
提前感谢您的帮助。
NB
上述注册过程包括两个独立的视图控制器。请告知这是否是常见做法/是否存在更合适的解决方案。
主要问题图片
解决上图中所示的问题是我的主要目标。
答案 0 :(得分:5)
如果您希望在用户完成2个注册VC时保持修复进度条,请使用视图控制器包含。
创建包含进度视图的父视图控制器和容纳2个注册VC之一的容器视图。使用embed segue将该容器视图链接到子视图控制器。您可以根据需要将子视图控制器设置为导航控制器,或者您可以简单地嵌入第一个注册VC,然后根据需要在第一个和第二个之间进行动画。
编辑:有一个名为的方法
transitionFromViewController:toViewController:duration:options:animations:completion:
,可让您轻松地在子视图控制器之间创建过渡。
第二次编辑:如果您需要在父视图控制器和子视图控制器之间进行通信,您必须自己连接一种方法。要从子进程通信回父进程,通常的方法是在子进程中设置委托属性并定义一个简单的协议以与父进行通信。在父级的prepareForSegue方法中,您将子级的委托属性设置为self。然后,孩子可以根据需要向父母发送消息。
在您的情况下,您将定义一个简单的协议,让孩子通知父级有关进度值的更改,然后父级将更新进度视图。 (让子视图控制器直接操作进度视图是个坏主意。)
如果您希望父级与子级进行通信,则需要在设置时保存指向子视图控制器的指针,类似于设置委托。
如果换出子视图控制器,则需要设置管道(子到父委托属性和父对子指针)作为交换子视图控制器的代码的一部分。
我在gitHub上有一个项目,其名称为“ test ”(链接),用于设置父级和子级视图控制器,以及从父级到子级以及来自子级的通信到了父母。
答案 1 :(得分:1)
根据我的观点,为两个控制器创建两个单独的UIProgressView
。
你所要做的就是发挥它的价值。这里重要的是数据而不是UI。我的意思是,如果你想表现出一半的进展已经完成。这可以通过在下一个控制器中创建一个新的UIProgressView
控件来实现,因为最终控制中的数据是更改UI将是相同的。
因此,当您完成第一个视图控制器上的完成过程时,将第一个进度控制的值传递给第二个视图控制器,并根据该值创建第二个进度控件。
如果您不知道如何在两个视图控制器之间传递数据,那么 answer 将对您有所帮助。
但是,如果您不愿意在两个不同的控制器上创建两个单独的进度,则可以将进度控件添加为根控制器窗口中的子视图。因此,它将共享所有控制器的通用屏幕,并保持在整个应用程序的顶部。
var appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
appDelegate.window?.addSubview(progressView)
答案 2 :(得分:0)
在这里为像我这样认为应该有更简单解决方案的其他人添加另一个答案,尤其是在入职流程场景中使用。
对于包含五步入职的示例场景,我的方法是:
yourProgressBar.progress = 0.2
let dispatchTime = DispatchTime.now() + 0.01 DispatchQueue.main.asyncAfter(deadline:dispatchTime, execute: { self.onboardingProgress.setProgress(0.4, animated: true)})
Dispatch Queue 允许将进度条设置为前一个 VC 的进度,然后动画显示新的进度。如果没有 DispatchQueue,整个 Progress Bar 会在 VC 加载时从头开始动画,完全破坏了预期的效果。
希望对大家有所帮助!