Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.

Uzak sunucudan gelen veriyi tableview sectionlarıyla kategorize etmek.

0 oy
23 kez görüntülendi
16, Haziran, 16 ios development kategorisinde dybala21 tarafından soruldu

Merhabalar. Basit bir uygulama üzerinde uzak sunucudan veri çekiyorum. Bu veriyi de tableview'a label ve detillabel kısımlarına basıyorum. Fakat yapmak istediğim şu, ben uzaktaki verilerin kategorisine göre tableview içerisinde expandable sections oluşturmak istiyorum. Sectionları ona göre bölmek istiyorum fakat bunu sağlayamadım. Lokaldeki arrayden çekerken bunu yapabiliyorum fakat uzak sunucudaki kaynaktan gelen veriler tek bir array içerisine dolduğu için bunu sağlayamıyorum. Daha detaylı bir şekilde uygulama içerisindeki ViewController pageinde bunu açıkladım. Proje dosyasını paylaşmam gerekirse şu şekilde: https://drive.google.com/file/d/1SvHImVialF3QIj6T2FBm7QKx_dk4QGkl/view?usp=sharing

Teşekkürler.

1 cevap

0 oy
16, Haziran, 16 yasin tarafından cevaplandı
17, Haziran, 17 dybala21 tarafından seçilmiş
 
En İyi Cevap

aşağıda, verdiğin örnek projede bulunan sunucu verisini nasıl kategorilere göre ayıracağına ilişkin bir düzenleme yaptım. Açıklamalar içinde.

 import UIKit

    typealias Urun = (urun: String, fiyat: String) // urunler için kullanacağımız tuple data tipini burada tanımlayalım
    typealias Kategori = (expanded: Bool, kategori: String, urunler:[Urun]) // kategoriler için kullanacağımız tuple data tipini burada tanımlayalım

    class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, ExpandableHeaderViewDelegate {

        @IBOutlet weak var tblView: UITableView!
        var kategoriler = [Kategori]()

        override func viewDidLoad() {
            super.viewDidLoad()
            parseData()
        }

        func parseData() {
            self.kategoriler.removeAll()
            var request = URLRequest(url: URL(string: "http://kozmogoni.com/public_html/deneme/deneme.php")!)
            request.httpMethod = "GET"
            let configuration = URLSessionConfiguration.default
            let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main)
            let task = session.dataTask(with: request) { (data, response, error) in
                if (error != nil) {
                    print("Error")
                }
                else {
                    do{
                        let fetchedData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! NSArray
                        fetchedData.forEach({ (rawData) in //döngümüz
                            if let castedData = rawData as? [String : Any] { //Ant data tipini String:Any array'ine cast edelim
                                if let receivedKategori = castedData["kategori"] as? String { // ilgili array içerisinde varsa 'kategori' key'inin değerini String data tipine cast edelim
                                    if let receivedUrun = castedData["urun"] as? String { // ilgili array içerisinde varsa 'urun' key'inin değerini String data tipine cast edelim
                                        if let receivedFiyat = castedData["fiyat"] as? String { // ilgili array içerisinde varsa 'fiyat' key'inin değerini String data tipine cast edelim
                                            let urun = Urun(urun: receivedUrun, fiyat: receivedFiyat) // alınan ürün ve fiyat bilgisiyle yeni bir 'Urun' tuple'ı oluşturalım
                                            if let index = self.kategoriler.index(where: { (kategori) -> Bool in // mevcut kategori tuple array'i içerisinde daha önce aynı kategoriden oluşturulmuş mu bir bakalım. varsa array index'ini alalım
                                                return kategori.kategori == receivedKategori // kategori tuple'i nin kategori değeri, alınan kategori adı ile aynıysa, kategoriler array'i içerisinde daha önceden bu kategori eklenmiş demektir.
                                            }) {
                                                var currentKategori = self.kategoriler[index] //alınan index'ile kategoriler array'i içerisinden ilgili kategori tuple'i ni bir değişkene alalım
                                                currentKategori.urunler.append(urun) // kategori tuple'i na ait değişkendeki 'urunler' array'ine yukarıda oluşturduğumumz yeni urun tipini ekliyoruz
                                                self.kategoriler[index] = currentKategori // kategori datasının son halini mevcut kategoriler array'inde yer alanan eski haliyle değiştiriyoruz.
                                            } else { // eğer kategoriler array'i içerisinde daha önce böyle bir kategori eklenmemişse index null geleceğinden aşağıda yeni bir kategori oluşturacağız
                                                let newKategori = Kategori(expanded: false, kategori: receivedKategori, urunler:[urun]) // yeni kategoriyi ilk ürünü ile birlikte oluşturuyoruz.
                                                self.kategoriler.append(newKategori) // yeni kategoriyi, kategoriler array'ine ekliyoruz.
                                            }
                                        }
                                    }
                                }
                            }
                        })
                        self.tblView.reloadData()
                    }
                    catch {
                        print("Error 2")
                    }
                }
            }
            task.resume()
        }

        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }

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

        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return kategoriler[section].urunler.count
        }

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

        func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
            if (kategoriler[indexPath.section].expanded) {
                return 44
            } else {
                return 0
            }
        }

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

        func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
            let header = ExpandableHeaderView()
            header.customInit(title: kategoriler[section].kategori, section: section, delegate: self)
            return header
        }

        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "labelCell")!
            cell.textLabel?.text = kategoriler[indexPath.section].urunler[indexPath.row].urun
            cell.detailTextLabel?.text = kategoriler[indexPath.section].urunler[indexPath.row].fiyat
            return cell
        }

        func toggleSection(header: ExpandableHeaderView, section: Int) {
            kategoriler[section].expanded = !kategoriler[section].expanded
            tblView.beginUpdates()
            for i in 0 ..< kategoriler[section].urunler.count {
                tblView.reloadRows(at: [IndexPath(row: i, section: section)], with: .automatic)
            }
            tblView.endUpdates()
        }


    }
17, Haziran, 17 dybala21 tarafından yorumlandı

Çok teşekkürler. Sayenizde bu kısmı aşabildim.

...