我正在开发一种聊天应用程序,它会询问一些问题以及用户可以回答的问题。
每个问题都有自己的屏幕,在用户回复问题后,有一个导航到下一个屏幕的按钮。
所有屏幕几乎都不一样。 UILabel和输入字段。现在我想知道是否有办法重用这个视图,所以我不必创建完全相同的多个视图控制器。
这是可能的,我应该寻找什么?
答案 0 :(得分:0)
您可以通过以下方式执行此操作:
在重用视图控制器中创建变量:
var question: String!
按钮操作需要执行segue:
@IBAction func nextQuestionAction() {
performSegue(withIdentifier: "NextQuestionSegue", sender: nil)
}
在准备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"
}
}
这就是它的工作原理。
答案 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中的相同字段。