创建基于步骤的视图控制器流

时间:2017-05-06 16:25:03

标签: ios swift

enter image description here

所以,如果你看一下提供的图片。我想知道实现这样的流程的最佳模式是什么。我可以将一堆ViewControllers串在一起,但我觉得我在重复自己的方式太多了。我尝试过制作一个可重用的xib,但即便如此,我仍然需要更新每个ViewController的步骤并添加内容/输入类型。我至少不要重复我的故事板中的所有约束。

所以这些都是这个屏幕的常见组件。根据步骤,他们自然会拥有不同的内容。我也有一个后退按钮。我有一个不同输入类型的工厂,它将在这个xib中生成渲染自定义视图。我想知道是否有人做过类似的设计,他们最好的实现方式是什么?

注意:我可以共享代码,但目前它非常重复,而且我还有很多故事板/ xib,所以我认为分享很多。图片可能更容易理解。

2 个答案:

答案 0 :(得分:1)

您可以使用故事板中的单个视图控制器执行此操作。

  1. 创建一个视图控制器类文件(在我的示例中,它被称为 视图控制器)。
  2. 将视图控制器添加到故事板并将其自定义类名称设置为刚刚创建的类。
  3. 将视图控制器嵌入导航控制器(带有视图) 在故事板中选择控制器,选择编辑器>嵌入> 导航控制器)。
  4. 在情节提要中的视图控制器上创建一个按钮。
  5. 从按钮到视图控制器创建一个segue - 是的,包含按钮的同一个视图控制器!为此,请控制从按钮拖动到视图控制器。给segue一个标识符,例如" nextStep"。
  6. 每次点击按钮,它都会转到同一个视图控制器的新实例。您可以根据需要重复多次。因为您在导航控制器中,所以您可以轻松地后退。

    当然,要做任何有趣的事情,你的视图控制器类需要跟踪你所处的步骤,管理状态,确定你何时到达终点等等。

    以下是视图控制器的一个简单实现,它会在您前进时递增步骤编号:

    class ViewController: UIViewController {
    
        var stepNumber = 1
    
        override func viewDidLoad() {
            super.viewDidLoad()
            self.title = "Step \(stepNumber)"
        }
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if segue.identifier == "nextStep" {
                if let destination = segue.destination as? ViewController {
                    destination.stepNumber = stepNumber + 1
                }
            }
        }
    } 
    

答案 1 :(得分:0)

将视图控制器模板放入独立的nib文件中。创建UIViewController的自定义子类,该子类使用该nib文件并了解如何从向导的一个步骤显示数据。在运行时创建子类的实例,并为每个步骤提供数据。您可以同时执行此操作(例如,您可以将它们堆叠到UIPageView中),或者如果您想以其他方式呈现它们,则可以一次执行一步。