Динамическая форма из JSON-ввода Swift - PullRequest
0 голосов
/ 18 мая 2019

У меня есть файл json, из которого я пытаюсь создать динамический файл в течение 3 страниц. Я передал данные json в модель с использованием Codable и могу распечатать его. Этот JSON имеет 3 страницы, которые, я полагаю, будут 3 UIViewController. Как мне создать эту динамическую форму, потому что я, кажется, запутался. Это то, что я пробовал до сих пор

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        guard let data = stubbedResponse("forms") else {return}
        do {
            let decoded = try JSONDecoder().decode(BaseModel.self, from: data)
            print(decoded)
        } catch {

        }
    }

    func stubbedResponse(_ filename: String) -> Data! {
        @objc class VC: NSObject {}

        let bundle = Bundle(for: VC.self)
        let path = bundle.path(forResource: filename, ofType: "json")
        return (try? Data(contentsOf: URL(fileURLWithPath: path!)))
    }
}

JSON:

{
  "id": "form_1",
  "name": "Pet Adoption Application Form",
  "pages": [
    {
      "label": "Page 1",
      "sections": [
        {
          "label": "Welcome to Pets Rescue",
          "elements": [
            {
              "type": "embeddedphoto",
              "file": "https://images.pexels.com/photos/8700/wall-animal-dog-pet.jpg?cs=srgb&dl=animal-collar-dog-8700.jpg&fm=jpg",
              "unique_id": "embeddedphoto_1",
              "rules": []
            }
          ]
        },
        {
          "label": "Basic Info",
          "elements": [
            {
              "type": "text",
              "label": "Your fullname",
              "isMandatory": true,
              "unique_id": "text_1",
              "rules": []
            },
            {
              "type": "text",
              "label": "Email address",
              "isMandatory": true,
              "unique_id": "text_2",
              "rules": []
            },
            {
              "type": "formattednumeric",
              "label": "Phone Number",
              "keyboard": "numeric",
              "formattedNumeric": "####-###-####",
              "isMandatory": true,
              "unique_id": "formattednumeric_1",
              "rules": []
            },
            {
              "type": "datetime",
              "mode": "date",
              "label": "Date of Birth",
              "isMandatory": true,
              "unique_id": "datetime_1",
              "rules": []
            }
          ]
        }
      ]
    },
    {
      "label": "Page 2",
      "sections": [
        {
          "label": "About your home",
          "elements": [
            {
              "type": "yesno",
              "label": "Do you have a yard?",
              "isMandatory": true,
              "unique_id": "yesno_1",
              "rules": [
                {
                  "condition": "equals",
                  "value": "Yes",
                  "action": "show",
                  "otherwise": "hide",
                  "targets": [
                    "text_3"
                  ]
                }
              ]
            },
            {
              "type": "text",
              "label": "Is it fenced? Also indicate the type",
              "isMandatory": false,
              "unique_id": "text_3",
              "rules": []
            }
          ]
        }
      ]
    },
    {
      "label": "Page 3",
      "sections": [
        {
          "label": "Additional Information",
          "elements": [
            {
              "type": "text",
              "label": "Please provide your veterinarian's name",
              "isMandatory": false,
              "unique_id": "text_4",
              "rules": []
            },
            {
              "type": "text",
              "label": "Please provide the name of a personal reference",
              "isMandatory": true,
              "unique_id": "text_5",
              "rules": []
            }
          ]
        }
      ]
    }
  ]
}

Я понимаю, что tableView также можно использовать в этом случае с кнопкой, обозначающей следующую страницу

1 Ответ

0 голосов
/ 18 мая 2019

У вас есть эта структура

struct BaseModel {  
 let pages: [Model] 
}

У вас будет виртуальный канал, который вы должны отображать рекурсивно, как

class SomeVC:UIViewController {
  var currentIndex = 0
  var pages = [Model]()
}

если вы, скажем, структурировали tableView, то внутри следующего действия страницы

let next = currentIndex + 1
if next < pages.count {
  let vc = SomeVC()
  vc.currentIndex = next
  vc.pages = pages
 // push the vc
}
else {
 // no more
}

Также у вас есть возможность сделать этот массив внутри синглтона

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...