如何为多个屏幕的过程重用视图控制器?

时间:2017-11-02 08:50:22

标签: ios swift

我正在开发一种聊天应用程序,它会询问一些问题以及用户可以回答的问题。

每个问题都有自己的屏幕,在用户回复问题后,有一个导航到下一个屏幕的按钮。

所有屏幕几乎都不一样。 UILabel和输入字段。现在我想知道是否有办法重用这个视图,所以我不必创建完全相同的多个视图控制器。

这是可能的,我应该寻找什么?

3 个答案:

答案 0 :(得分:0)

您可以通过以下方式执行此操作:

  1. 在重用视图控制器中创建变量:

    var question: String!
    
  2. 按钮操作需要执行segue:

    @IBAction func nextQuestionAction() {
        performSegue(withIdentifier: "NextQuestionSegue", sender: nil)
    }
    
  3. 在准备segue时,在转换之前,您需要指定下一个问题:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        super.prepare(for: segue, sender: sender)
        if segue.identifier == "NextQuestionSegue" {
            guard let destinationVC = segue.destination as? ReuseViewController else { return }
            destinationVC.question = "Question goes here"
        }
    }
    
  4. 这就是它的工作原理。

答案 1 :(得分:0)

对于我的想象,你在PageViewController QuestionsViewController中有一个屏幕流。那么你可以做些什么让一个UIViewController TitleInputViewController公开UITextViewDelegate的闭包和答案提交动作回调和两个属性,一个用于UILabel,另一个用于UIField。

  • var textFieldDidChangeCallback: (String?) -> Void:可用于显示字段验证消息
  • var didSubmitAnswerCallback: (String?) -> Void:可用于显示字段验证消息和/或显示下一个/上一个控制器
  • @IBOutlet var titleLabel: UILabel!:可用于设置标题文字,字体和文字颜色
  • @IBOutlet var inputField: UITextField!:可用于设置标题文字,字体,验证错误消息和文字颜色

然后,让QuestionsViewController创建此TitleInputViewController的多个实例,使用这些回调管理并显示它们。

答案 2 :(得分:0)

当然有可能。

您可以通过编程方式实例化ViewControllers并将其推送到导航控制器中或以您希望的方式显示。为此,您可以使用:

let nextVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "formViewController")

其中“Main”是故事板的名称,标识符是您在该故事板上为该页面设置的标识符。

现在您拥有了我们的viewController(将其转换为您的特定类型as! FormViewController),您可以根据需要设置属性。 (标签的文本或TextField的代表。)

如果您有这些表单的修订顺序,那么您还可以在故事板上放置多个VC,将它们链接在一起并将它们的类设置为相同的ViewController类。然后将插座连接到该VC中的相同字段。