>source

ViewController에서 내 모델에 액세스하고 테이블보기에서로드 할 모델 데이터를 사용하는 방법 ????

My ViewController는 이렇게 보입니다

import UIKit
class ViewController: UIViewController {
    var cclm: CountryCodeListModel?
    override func viewDidLoad() {
        super.viewDidLoad()
        Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(hello), userInfo: nil, repeats: true)
        readLocalJSONFile(forName: "countryList")
        //Do any additional setup after loading the view.
    }
    override func viewDidAppear(_ animated: Bool) {
    }
    @objc func hello()
     {
        print(cclm?.data?[0].flag)
     }
}

및 My Model 클래스는 다음과 같습니다.

struct CountryCodeList : Decodable {
    var alpha2Code: String?
    var alpha3Code: String?
    var flag      : String?
    var name      : String?
    var code      : String?
}
public struct CountryCodeListModel : Decodable {
    var data      : [CountryCodeList]?
}
var cclm: CountryCodeListModel?
//Method to load json
func readLocalJSONFile(forName name: String) {
    do {
        if let filePath= Bundle.main.path(forResource: name, ofType: "json") {
            let fileUrl= URL(fileURLWithPath: filePath)
            let data= try Data(contentsOf: fileUrl)
            if let countryCodeObject= parse(jsonData: data) {
                cclm= countryCodeObject
                print(cclm?.data?[1].alpha2Code ?? "")  //Printing Correct Value
            }
        }
    } catch {
        print("error: \(error)")
    }
}
func parse(jsonData: Data) -> CountryCodeListModel?{
    var dataArray : [Dictionary<String,Any>]= [[:]]
    var country= Dictionary<String,Any>()
    var modelData= Dictionary<String,Any>()
    do {
        //make sure this JSON is in the format we expect
        if let json= try JSONSerialization.jsonObject(with: jsonData, options: []) as? Dictionary<String,Any> {
            dataArray.removeAll()
            for item  in json["data"] as! [Dictionary<String, Any>] {
                country= item
                let url= URL(string: country["flag"] as? String ?? "")
                let data= try? Data(contentsOf: url!) //make sure your image in this url does exist, otherwise unwrap in a if let check /try-catch
                let image= UIImage(data: data!)
                let documentsDirectory= FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
                let fileName= url?.lastPathComponent //name of the image to be saved
                let fileURL= documentsDirectory.appendingPathComponent(fileName ?? "")
                if let data= image?.jpegData(compressionQuality: 1.0){
                    do {
                        try data.write(to: fileURL)
                        country["flag"]= fileURL.absoluteString
                        //print("file saved")
                        //urlAsString= fileURL.absoluteString
                    } catch {
                        print("error saving file:", error)
                    }
                }
                dataArray.append(country)
                country.removeAll()
            }
            modelData["data"]= dataArray
            //print(modelData)
            let jsonData1= try JSONSerialization.data(withJSONObject: modelData, options: [])
            do {
                    let decodedData= try JSONDecoder().decode(CountryCodeListModel.self, from: jsonData1)
                    return decodedData
                } catch {
                    print("error: \(error)")
                }
        }
    } catch let error as NSError {
        print("Failed to load: \(error.localizedDescription)")
    }
    return nil
}

문제 설명서 :

IAM 로컬 JSON을 읽고 플래그 키의 URL 값을 가져 와서 해당 이미지를 로컬로 다운로드하십시오. 다운로드 한 후 Dictionary에서 로컬 경로를 사용하고 업데이트 한 다음 JSON 객체를 만들고 My Model 클래스를 업데이트하십시오.

이제는 아래와 같은 ViewController에서 내 모델 클래스에 액세스하려고합니다.

print(CountryCodeListModel?.data?[0].name) //check screenshot for error
 print(cclm?.data?[0].flag)                 //this prints nil always

첨부 된 오류 스크린 샷을 확인하십시오

내 JSON이 이렇게 보입니다

{
   "meta":{
      "success":true,
      "message":"Successfully retrieved country details",
      "code":"200"
   },
   "data":[
      {
         "alpha2Code":"AF",
         "alpha3Code":"AFG",
         "flag":"https://raw.githubusercontent.com/DevTides/countries/master/afg.png",
         "name":"Afghanistan",
         "code":"+93"
      },
      {
         "alpha2Code":"AX",
         "alpha3Code":"ALA",
         "flag":"https://raw.githubusercontent.com/DevTides/countries/master/ala.png",
         "name":"Aland Islands",
         "code":"+358"
      },
      {
         "alpha2Code":"AL",
         "alpha3Code":"ALB",
         "flag":"https://raw.githubusercontent.com/DevTides/countries/master/alb.png",
         "name":"Albania",
         "code":"+355"
      },
      {
         "alpha2Code":"DZ",
         "alpha3Code":"DZA",
         "flag":"https://raw.githubusercontent.com/DevTides/countries/master/dza.png",
         "name":"Algeria",
         "code":"+213"
      },
      {
         "alpha2Code":"AS",
         "alpha3Code":"ASM",
         "flag":"https://raw.githubusercontent.com/DevTides/countries/master/asm.png",
         "name":"American Samoa",
         "code":"+1684"
      }
]
}

CountryCodelistModel은 수업입니다. 이것을 청사진으로 생각할 수 있습니다. 속성 플래그와 이름을 정의합니다 ... 그러나 단지 청사진입니다. 그것은 실제 일이 아닙니다.

aheze2021-05-11 19:35:30

cclm? .data? [0] .flag가 올바른 방법입니다. 그러나 당신이 결코 그것을 초기화하지 않았기 때문에 (초기화는 해당 청사진에서 실제 객체를 만드는 것과 같습니다. CCLM= CountryCodelistModel ()을 수행해야합니다.)

aheze2021-05-11 19:36:24

그러나 JSON에서 디코딩하고 있습니다. CountryCodeObject= Parse (jsondata : data) {cclm= CountryCodeObject}가 CCLM을 초기화하지만 Parse () 메서드가 NIL을 반환하지 않는 경우에만 CCLM을 초기화합니다. 그것은 이것이 nil을 반환하는 것처럼 보입니다 ... 당신의 JSON이 그것에 문제가있을 수 있음을 의미합니다.

aheze2021-05-11 19:38:04
  • 이전 c++ : LNK2001 클래스 (OpenGL)의 외부 기호 해결되지 않은
  • 다음 c++ : VCL 양식 응용 프로그램은 stdout에 작성합니다