Adakah yang bisa tolong beri tahu saya apa yang saya lakukan salah di sini? Saya tidak dapat meneruskan data JSON dari URLSession.shared.dataTask ke ekstensi luar Juga tidak dapat membawa func numberOfSections .. etc untuk digunakan di URLSession.shared.dataTask

Setiap bantuan dihargai, terima kasih atas waktu Anda.

Cepat

Struct getSubData: Decodable { let id: Int let name: String }

Struct Bagian: Decodable { let id: Int let name: String let subData: [getSubData] }

Class indexViewController: UIViewController { @IBOutlet var lemah tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    let url = "https://nabulsi.com/nabulsi_app/main_sections_v4.json"
                         let urlObj = URL(string: url)
                         URLSession.shared.dataTask(with: urlObj!){(data, response, error) in
                             do {
                                 let sections = try JSONDecoder().decode([Section].self, from: data!)
                                for section in sections {
                                    print(section.name)
                                    let sectionName = section.name
                                    for data in section.subData {
                                        print(data.name)
                                        let subSectionName = data.name
                                    }
                                }
                             } catch {
                                 print("We got an error")
                             }
                         }.resume()
}

}

Ekstensi indexViewController: UITableViewDataSource, UITableViewDelegate {

func numberOfSections(in tableView: UITableView) -> Int {
    return sectionName.count

}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return sectionName[section].subSectionName?.count ?? 0

}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.textLabel?.text = sectionName[indexPath.section].subSectionName?[indexPath.row]

    return cell
}

}

0
Hussam Dabaan 9 Januari 2020, 19:21

2 jawaban

Jawaban Terbaik

Kelas JsonDecoder tidak memiliki kesempatan untuk mengurai data Anda hanya karena teks JSON yang diterima dari server bukan format yang valid.

Inilah titik akhir Anda, buka di browser web: https://nabulsi.com/nabulsi_app/main_sections_v4. json

Dan inilah alat validator JSON: https://jsonlint.com

Salin dan tempel untuk memvalidasi respons server Anda ke alat validator JSON yang disebut jsonlint, dan Anda akan melihat di mana salahmu.

Mungkin itu bukan salahmu. Ini tentang pengembang backend Anda jika Anda tidak menulis sendiri. Hubungi dia untuk memperbaiki format JSON. Setelah memperbaiki masalah, beri tahu saya. Saya akan memperbaiki kode parse Anda jika masih tidak berfungsi seperti yang Anda harapkan.

  • EDIT: Setelah memperbaiki masalah, kode terkait di sini:

[0] - Nilai json yang diurai ditetapkan ke variabel lokal.

class indexViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
var sections: [Section] = []

override func viewDidLoad() {
    super.viewDidLoad()
    let url = "https://nabulsi.com/nabulsi_app/main_sections_v4.json"
    let urlObj = URL(string: url)
    URLSession.shared.dataTask(with: urlObj!){(data, response, error) in
        do {
            let sections = try JSONDecoder().decode([Section].self, from: data!)
            self.sections = sections // [0]

            DispatchQueue.main.async {
                self.tableView.reloadData()
            }

        } catch {
            print("We got an error")
        }
    }.resume()
  }
}
  • Lihat kodenya dan ikuti penjelasan singkat ini:

[1] - Kembalikan setiap baris di bagian, dari array lokal

[2] - Menetapkan variabel nama ke label untuk baris saat ini

[3] - Menetapkan variabel nama ke header untuk bagian saat ini

extension indexViewController: UITableViewDataSource, UITableViewDelegate {

func numberOfSections(in tableView: UITableView) -> Int {
    return sections.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let subDatas = sections[section].subData // [1]
    return subDatas.count ?? 0
}



func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

    // [2]
    let currentSection = sections[indexPath.section]
    let currentSubdata = currentSection.subData[indexPath.row]
    cell.textLabel?.text = currentSubdata.name

    return cell
}


func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let view = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.width, height: 40))
    view.backgroundColor = #colorLiteral(red: 1, green: 0.3653766513, blue: 0.1507387459, alpha: 1)

    let lbl = UILabel(frame: CGRect(x: 0, y: 0, width: view.frame.width - 15, height: 40))
    lbl.font = UIFont.systemFont(ofSize: 20)
    lbl.text = sections[section].name // [3]
    lbl.textAlignment = .right
    view.addSubview(lbl)

    return view
}

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 40
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 40
  }
}

Selamat Mengkode! =]

1
asilturk 11 Januari 2020, 18:02

Bawa saja bagian Array di luar fungsi Anda. Simpan sebagai milik pengontrol Anda.

class indexViewController: UIViewController { 

  @IBOutlet weak var tableView: UITableView!
  var sections: [Section] = []

  override func viewDidLoad() {
    super.viewDidLoad()

    let url = "https://nabulsi.com/nabulsi_app/main_sections_v4.json"
    let urlObj = URL(string: url)
    URLSession.shared.dataTask(with: urlObj!) {
     [weak self](data, response, error) in
     do {
          self?.sections = try JSONDecoder().decode([Section].self, from: data!)
          for section in sections {
            //your code goes here                         
          }
    } 
    catch {
      print("We got an error")
    }
  }.resume()
}
0
udbhateja 9 Januari 2020, 17:05