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

Tableview Veri filitreleme?

0 oy
66 kez görüntülendi
30, Ocak, 2017 ios development kategorisinde csayin tarafından soruldu
30, Ocak, 2017 yasin tarafından düzenlendi

merhabalar herkese,

yakinda sorduğum sorularla forumda meşhur olacak uygulamamda. json ile aşagıdaki veriyi çekiyorum;

[

  {

    "ID": 12,

    "dc_sinif": "1-A",

    "dc_gun": "Pazartesi",

    "dc_ders_programi": "9.00-10.00 Matematik | 10.00-11.00 Fen bilgisi | 11.00-12.00 Sosyal Bilgiler "

  },

  {

    "ID": 13,

    "dc_sinif": "1-A",

    "dc_gun": "Salı",

    "dc_ders_programi": "9.00-10.00 Fen bilgisi | 10.00-11.00 Sosyal Bilgiler | 11.00-12.00  Matematik"

  },

  {

    "ID": 14,

    "dc_sinif": "1-A",

    "dc_gun": "Çarşamba",

    "dc_ders_programi": "9.00-10.00 Sosyal Bilgiler | 10.00-11.00  Fen bilgisi | 11.00-12.00  Matematik"

  },

  {

    "ID": 15,

    "dc_sinif": "1-A",

    "dc_gun": "Perşembe",

    "dc_ders_programi": "9.00-10.00 Fen bilgisi | 10.00-11.00 Sosyal Bilgiler | 11.00-12.00  Matematik"

  },

  {

    "ID": 16,

    "dc_sinif": "1-A",

    "dc_gun": "Cuma",

    "dc_ders_programi": "9.00-10.00 Matematik | 10.00-11.00 Fen bilgisi | 11.00-12.00 Sosyal Bilgiler"

  },

  {

    "ID": 17,

    "dc_sinif": "1-B",

    "dc_gun": "Pazatesi",

    "dc_ders_programi": "9.00-10.00 Matematik | 10.00-11.00 Fen bilgisi | 11.00-12.00 Sosyal Bilgiler"

  },

  {

    "ID": 18,

    "dc_sinif": "1-B",

    "dc_gun": "Salı",

    "dc_ders_programi": "9.00-10.00 Fen bilgisi | 10.00-11.00 Sosyal Bilgiler | 11.00-12.00  Matematik"

  },

  {

    "ID": 19,

    "dc_sinif": "1-B",

    "dc_gun": "Çarşamba",

    "dc_ders_programi": "9.00-10.00 Fen bilgisi | 10.00-11.00 Sosyal Bilgiler | 11.00-12.00  Matematik"

  },....

]

bu veriyi tableviewda sadece "dc_sinif" alanini listeliyorum ve secilen sinifin detayina gitmek istiyorum. Sorun şu ki her sinifi bir kere degilde verideki kadar listelebildim. yani bir tane "1-a" olmasini istiyorum ama json'daki kadar listeleniyor ve yine ayni sekilde detay ekraninda "1-a" yi sectigimde 1-a'nin detayi yerine bütün veri table view'a geliyor.

 for sinif in jsonObj!{

                    if let classDict = sinif as? NSDictionary {

                        if let name = classDict.value(forKey: "dc_sinif") {

                               self.sinifArray.append(name as! String)

                        }......

veriyi bu sekilde diziye atip

let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! cTableViewCell



        cell.selectionStyle = UITableViewCellSelectionStyle.none



        cell.lblSinif.text = sinifArray[indexPath.row]

cellforrowat indexpath'te boyle tableview'a yolluyorum.

bu dizilere nasil bir filtreleme yapmaliyim. 1 tableview'da herbir sinifi nasil 1 kez yazip yanlizca o sinifa ait detayi 2. table viewda gostermek icin nasil bir filtreleme yapmaliyim?

1 cevap

0 oy
30, Ocak, 2017 yasin tarafından cevaplandı
2, Şubat, 2017 csayin tarafından seçilmiş
 
En İyi Cevap

json verisini

siniflar
|_____günler -> dersporogamı

şeklinde yapsaydın ya. Gereksiz veri transferi yapıyorsun diyeceğim ama bilemiyorum tabi, belki başka nedeni vardır.
neyse, şu şekilde;

for sinif in jsonObj!{

            if let classDict = sinif as? NSDictionary {
              if let name = classDict.value(forKey: "dc_sinif") {
                if !self.sinifArray.contains(where: { (String) -> Bool in
                    if String == name {
                        return true
                    }
                    return false
                }) {
                    self.sinifArray.append(name)
                }
              }
            }
        }

bir kere eklediğin sınıfı, bir daha array'e eklememiş olursun.
kullanıcı ikinci tableView'a gittiğinde de, daha önceki örnekte yaptığım gibi, ikinci viewController'a sınıf String'ini pass eder ve tüm datanın içerisinden sadece seçilen sınfın adıyla eşleşen veriyi bir array'in içerisine atıp tableView'da listelenmesini sağlarsın.

30, Ocak, 2017 csayin tarafından yorumlandı

enter image description hereHocam cevabınız icin teşekkür ederim öncelikle. Ağustos ayından geçtiğimiz haftaya kadar da maalesef ios icin hic bir calışma yapamadım. Webservice ile baglantili ilk çalısmam bu uygulama. bazı noktalarda kendime ve uygulamaya angarya yaptirdigimin farkındayım. json'dan gelen verileri ve json icerigini ise ben hazırlamıyorum maalesef.

cevabinizi ise uygulamaya aktardım gözden kacirdigim bi nokta var galiba hala screenshot’da ki hatayı alıyorum. bi cozumde bulamadım.

https://drive.google.com/open?id=0B-mxXNuEWybRXzZOUUNvbVJXVDg

30, Ocak, 2017 yasin tarafından yorumlandı

yukarıda verdiğim örneği düzelttim. Denemeden burada yazdığım için bir hata yapmışım. Kusuruma bakma. En son hali yukarıda. Bir daha dene istersen.

31, Ocak, 2017 csayin tarafından yorumlandı
31, Ocak, 2017 csayin tarafından düzenlendi

Estagfurullah hocam verdiginiz kod ile siniflari birer kez listeleyebildim, ancak detayda sorun devam ediyor.detay view controller’ında veriyi yeniden çekmiyorum. siniflari listelediğim tableview’da çektiğim verileri diziye atıp detay’a yolluyorum. burada sorun şöyle devam ediyor detayda listelenen veri webservis verisiyle uyuşmuyor. ornegin 1-b, secip detaya gitmek ve 1-b’nin pazartesinden cumaya gün gün ders programını listelemek istiyorum.

ancak 1-b’yi seçtiğimde detayda gelen verinin 1-b’ye ait asagidaki verisini listeleyemiyorum.

  {
    "ID": 17,
    "dc_sinif": "1-B",
    "dc_gun": "Pazatesi",
    "dc_ders_programi": "9.00-10.00 Matematik | 10.00-11.00 Fen bilgisi | 11.00-12.00 Sosyal Bilgiler"
  },
  {
    "ID": 18,
    "dc_sinif": "1-B",
    "dc_gun": "Salı",
    "dc_ders_programi": "9.00-10.00 Fen bilgisi | 10.00-11.00 Sosyal Bilgiler | 11.00-12.00  Matematik"
  },
  {
    "ID": 19,
    "dc_sinif": "1-B",
    "dc_gun": "Çarşamba",
    "dc_ders_programi": "9.00-10.00 Fen bilgisi | 10.00-11.00 Sosyal Bilgiler | 11.00-12.00  Matematik"
  },
  {
    "ID": 20,
    "dc_sinif": "1-B",
    "dc_gun": "Perşembe",
    "dc_ders_programi": "9.00-10.00 Matematik | 10.00-11.00 Fen bilgisi | 11.00-12.00 Sosyal Bilgiler"
  },
  {
    "ID": 21,
    "dc_sinif": "1-B",
    "dc_gun": "Cuma",
    "dc_ders_programi": "9.00-10.00 Fen bilgisi | 10.00-11.00 Sosyal Bilgiler | 11.00-12.00  Matematik"
  }
31, Ocak, 2017 yasin tarafından yorumlandı

iki struct oluştur

struct MyClass {
    var recordId:Int
    var className:String
    var programPerDay:[MyProgram]
}

struct MyProgram {
    var day:String
    var program:String
}

bir de parse edeceğing json'datasının tutlacağı, bu struct'ları kullanan array,

var sinifArray:[MyClass] = []

parse işlemini şu loop'u kullanarak yap ve veriyi sinifArray dizisine aktar

for sinif in jsonObj!{            
            if let classDict = sinif as? NSDictionary {
                if let id = classDict["ID"] as? Int {
                    if let sinif = classDict["dc_sinif"] as? String {
                        if let gun = classDict["dc_gun"] as? String {
                            if let program = classDict["dc_ders_programi"] as? String {
                                if let index = self.sinifArray.index(where: { (myClass) -> Bool in
                                    if myClass.className == sinif {
                                        return true
                                    }
                                    return false
                                }) {
                                    self.sinifArray[index].programPerDay.append(MyProgram(day: gun, program: program))
                                } else {
                                    let newClass = MyClass(recordId: id, className: sinif, programPerDay: [MyProgram(day: gun, program: program)])
                                    self.sinifArray.append(newClass)
                                }
                            }
                        }
                    }
                }
            }
        }

sınıfların listeleneceği ilk table view'da cellForRowAt indexPath metodunda sınıf adına şöyle ulaşacaksın.

let myClass = self.sinifArray[indexPath.row]
        cell.textLabel?.text = myClass.className

ikinci tableViewController'da ikinci struct yapısını kullanan bir array property'si oluştur

var myPrograms:[MyProgram] = []

ilk tableView'da bir sınıfa tıklandığında didSelectRowAt indexPath metodu içserisinde bir yukarıda oluşturduğun myPrograms property'sine göndereceğin data şu olacak

let myClass = self.sinifArray[indexPath.row]
        let selectedClassProgram = myClass.programPerDay

ikinci tableView'a ait override metodlarda program detaylarına şöyle ulaşacaksın.

let myProgram = self.myPrograms[indexPath.row]
        let gun = myProgram.day
        let dersProgramı = myProgram.program
1, Şubat, 2017 csayin tarafından yorumlandı
1, Şubat, 2017 csayin tarafından düzenlendi

hocam teşekkür ederim ancak tekrar tekrar kontrol ettim ama detay table view hala bos geliyor. dogru analiz edebildiysem detay view'daki dizi bos geliyor, nereyi gözden kaçırmış olabilirim?

1, Şubat, 2017 yasin tarafından yorumlandı
2, Şubat, 2017 csayin tarafından yorumlandı

Hocam tekrar tekrar teşekkür ederim. Tertemiz oldu çok sağolun. :)

...