Как отображать данные из Api и Json.file - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть два данных 1. Из json 2. Из json.file

Формат данных ниже: -

{
  "data": [
    {
      "question": "Gender",
      "options": [
        "Male",
        "Female"
      ],
      "button_type": "2"
    },
    {
      "question": "How old are you",
      "options": [
        "Under 18",
        "Age 18 to 24",
        "Age 25 to 40",
        "Age 41 to 60",
        "Above 60"
      ],
      "button_type": "2"
    },
    {
      "button_type": "2",
      "question": "I am filling the Questionnaire for?",
      "options": [
        "Myself",
        "Mychild",
        "Partner",
        "Others"
      ]
    }
  ]
}

Это моя модель: -

enum NHAnswerType:Int
{
     case NHAnswerCheckboxButton = 1
     case NHAnswerRadioButton

     case NHAnswerSmileyButton
     case NHAnswerStarRatingButton

     case NHAnswerTextButton
}

class NH_QuestionListModel: NSObject {

    var dataListArray33:[NH_OptionsModel] = []

    var id:Int!
    var question:String!
    var buttontype:String!
    var options:[String]?
    var v:String?
    var answerType:NHAnswerType?

    var optionsModelArray:[NH_OptionsModel] = []
    init(dictionary :JSONDictionary) {

        guard   let question = dictionary["question"] as? String,
            let typebutton = dictionary["button_type"] as? String,

                let id = dictionary["id"] as? Int
             else {
                return

        }
       // (myString as NSString).integerValue

        self.answerType = NHAnswerType(rawValue: Int(typebutton)!)

        if let options = dictionary["options"] as? [String]{
           print(options)

            for values in options{
                print(values)
                let optionmodel = NH_OptionsModel(values: values)
                self.optionsModelArray.append(optionmodel)
            } 
        }

        self.buttontype = typebutton
        self.question = question
        self.id = id
    }
  }

optionmodel: -

class NH_OptionsModel: NSObject {

    var isSelected:Bool? = false
    var textIndexPath :IndexPath?

    var dummyisSelected:Bool? = false

    var v:String?
        var values:String?

     init(values:String) {
           self.values = values
           print( self.values)
        }
  }

Viewmodel в questionviewmodel: -

 func loadData(completion :@escaping (_ isSucess:Bool) -> ()){

        loadFromWebserviceData { (newDataSourceModel) in

            if(newDataSourceModel != nil)
            {
                self.datasourceModel = newDataSourceModel!
                completion(true)
            }
            else{
                completion(false)
            }
        }
     }
  func loadFromWebserviceData(completion :@escaping (NH_QuestionDataSourceModel?) -> ()){

        //with using Alamofire  ..............
        //  http://localhost/json_data/vendorlist.php
        Alamofire.request("http://www.example.com").validate(statusCode: 200..<300).validate(contentType: ["application/json"]).responseJSON{ response in
            let status = response.response?.statusCode
            print("STATUS \(status)")

            print(response)

            switch response.result{

            case .success(let data):
                print("success",data)

                let result = response.result

                print(result)

                if  let wholedata = result.value as? [String:Any]{

                    print(wholedata)

                   // let data2 = wholedata["data"] as? [String:Any]
                        self.datasection1 = wholedata

                    if  let data1 = wholedata["data"] as? Array<[String:Any]>{
                        print(data)
                        print(response)

                        for question in data1 {
                            let typebutton = question["button_type"] as? String
                            print(typebutton)
                            self.type = typebutton

                            let options = question["options"] as! [String]
                         //   self.dataListArray1 = [options]
                            self.tableArray.append(options)
                           // self.savedataforoptions(completion: <#T##(NH_OptionslistDataSourceModel?) -> ()#>)

                            self.no = options.count
                        }

                        print(self.tableArray)

                        let newDataSource:NH_QuestionDataSourceModel = NH_QuestionDataSourceModel(array: data1)

                        completion(newDataSource)
                    }
                }

            case .failure(let encodingError ):
                print(encodingError)

                //  if response.response?.statusCode == 404{
                print(encodingError.localizedDescription)

                completion(nil)
            }
        }}

фиктивная модель представления данных: -

  func loadFromDummyData(completion :@escaping (NH_DummyDataSourceModel?) -> ()){

if let path = Bundle.main.path(forResource: "jsonData", ofType: "json") {
    do {
        let jsonData = try NSData(contentsOfFile: path, options: NSData.ReadingOptions.mappedIfSafe)

        do {
            let jsonResult: NSDictionary = try JSONSerialization.jsonObject(with: jsonData as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary

           // self.datasection2 = jsonResult as! [String : Any]

            let people1  = jsonResult["data"] as? [String:Any]
            self.datasection2 = jsonResult as! [String : Any]
            if let people  = jsonResult["data"] as? Array<[String:Any]> {
                //  self.dict = people

                for person in people {
                    let options = person["options"] as! [String]
                    self.tableArray.append(options)
                    let name = person ["question"] as! String
                   self.tableArray.append(options)
                }
                let newDataSource:NH_DummyDataSourceModel = NH_DummyDataSourceModel(array: people)

                completion(newDataSource)
            }
        } catch {}
    } catch {}
  } 
}

 func loadData1(completion :@escaping (_ isSucess:Bool) -> ()){

 loadFromDummyData{ (newDataSourceModel) in

    if(newDataSourceModel != nil)
    {
        self.datasourceModel = newDataSourceModel!
        completion(true)
    }
    else{
        completion(false)
     }
  }
}

наконец в viewcontroller: -

в viewDidLoad: -

 questionViewModel.loadData { (isSuccess) in

            if(isSuccess == true)
            {
                let sec = self.questionViewModel.numberOfSections()
                for _ in 0..<sec
                {
                    self.questionViewModel.answers1.add("")
                    self.questionViewModel.questions1.add("")
                    self.questionViewModel.questionlist1.add("")
                }

               self.item1 = [self.questionViewModel.datasection1]

               self.activityindicator.stopAnimating()
               self.activityindicator.isHidden = true
               self.tableview.refreshControl = refreshControl
               self.tableview .allowsMultipleSelection = false
               self.tableview.reloadData()

                self.dummyDataViewModel.loadData1{ (isSuccess) in

                    if(isSuccess == true)
                    {

                    }
                    else{
                     self.viewDidLoad() 
                    }
                }
            }
            else{
                self.activityindicator.stopAnimating()

                self.activityindicator.isHidden = true

                let controller = UIAlertController(title: "No Internet Detected", message: "This app requires an Internet connection", preferredStyle: .alert)
                // Create the actions
                let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default) {
                    UIAlertAction in
                    NSLog("OK Pressed")
                    self.viewDidLoad()
                }
                controller.addAction(okAction)
                self.present(controller, animated: true, completion: nil)
            }
            self.sections = [Category(name:"A",items:self.item1),
                        Category(name:"B",items:self.item2),
            ]

            print(self.sections)
             self.tableview.reloadData()
        }

Это формат из json.file, а также из API.Я использовал tableview.

Так что мне нужно перечислить заголовок заголовка с помощью ключа "question"

И ячейка для строки должна отображаться из клавиш выбора.

Таккак сложить эти две данные из Json и Json.file?

1 Ответ

0 голосов
/ 28 сентября 2018

Вы можете создавать свои модели, которые представляют вашу модель.Предпочтительно, как

struct ResponseModel: Codable {
 var data: [Question]?
}

struct QuestionModel{
 var question: String?
 var options: [String]?
}

Затем после вашей публикации Ajax

let responseData = try JSONDecoder().decode(AjaxResponse<ResponseModel>.self, from: data!)

Теперь у вас есть ваши данные.

Затем вы можете сделать в вашем UITableViewDeleates

// количество секций

resposnseData.data.count

// количество строк в секции

responseData.data[section].options.count

// ячейка для индекса изменяет вашу ячейку, используя

response.data[indexPath.section].options[indexPath.row]

Hopeэто помогает.

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