2017-07-11 11 views
0

JSONデータを解析した後、表形式で表示します。初めてうまく動作します。テーブルビューのセルには、3つのボタン(in、out、absent)がありました。いずれかのボタンをクリックすると、他のJSON APIを呼び出すことができます。 JSONからデータを取得した後、テーブルビューを更新して新しいデータを再ロードする必要がありますが、いずれかのボタンテーブルビューをクリックするとデータが繰り返されます。スクロールするとuitableviewデータが繰り返される

enter image description here

どのように私はこの問題を克服していますか?これはコードです:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    var cell = 
     tableView.dequeueReusableCell(
      withIdentifier: "DetailsCell", for: indexPath) as! AttendanceDetailsTableViewCell 

    let row = (indexPath as NSIndexPath).row 

    if(attendanceInfo.count>0){ 
     cell.Class.text = attendance.standard 
     cell.NameLabel.text = attendance.name 
     cell.InLabel.text = attendance.inTime 
     cell.OutLable.text = attendance.outTime 
     return cell 
    } 

第二のデータ機能成功したとき:

if(errorCode == "0") 
{ 
    self.getAttendances() 
} 

をこれがgetAttendances()関数です:

let task = session.dataTask(with:request,completionHandler:{(d,response,error)in 
     do{ 
      if let data = d { 
       if let jsonData = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary { 
//     print("json data ",jsonData) 

        errorCode = String(describing: jsonData["errorCode"]!) 

        msg = jsonData["msg"] as! String 

        if errorCode == "0" { 
         if let kid_list = jsonData["students"] as? NSArray { 
          for i in 0 ..< kid_list.count { 
           if let kid = kid_list[i] as? NSDictionary { 
            if let store = kid["attendance"] as? NSDictionary 
            { 
             self.attendanceInfo.append(AttendanceInfo(
              studentId: kid["studentId"] as? String, 
              name:kid["studentName"] as? String, 
              classId : kid["classId"] as? String, 
              standard: ((kid["standard"] as? String)! + " " + (kid["section"] as? String)!), 
              photo : (imageURL), 
              school: kid["schoolName"] as? String, 
              schoolId : "1", 
              url : self.serverURL, 

              attendanceDate: AttendanceDate, 
              inTime : InTime, 
              outTime: Outtime, 
              attendance:Attendance, 
              updatedTime:updateTime, 
              attendanceId: AttendaceID 

              ) 
             )            
            } 
           } 
          } 
          self.do_table_refresh() 
         } 
        } else { 
         self.displayAlert("", message: msg) 
        } 
       } else { 
        self.displayAlert("error") 
       } 
      }else { 
       self.displayAlert("error") 
      } 
     } catch let err as NSError { 
      print("JSON Error \(err)") 
     } 
    }) 

    task.resume() 
} 

func do_table_refresh(){ 
    DispatchQueue.main.async(execute: { 
     self.activityIndicatorView.stopAnimating() 

     self.TableView.reloadData() 
     return 
    }) 
} 

表データを更新した後、データが繰り返され、ビューとテーブルリロードする。

+0

サイドノートに入る直前にself.attendanceInfo.removeAll()を追加します:あなたはあなたのコードを改善するために、 'ガードlet'文をチェックアウトする必要があります。これらの ''あれば ''と ''中かっこ ''は、コードを不必要に長くして読みにくいものにします。 – LinusGeffarth

+0

これを行うと 'attendance.standard'、'出席 'はどこから来ますか? –

+0

'cellForRowAt'メソッドはコンパイルされません。テーブルビューでの予期しないデータの繰り返しは、UI要素が 'if'条件で変更され、デフォルト値を割り当てるための' else'節を追加しない場合に発生します。 – vadian

答えて

0

新しいデータを追加する前にアレイをクリアする必要があります。そうしないと、最後にアイテムが常に追加されます。

それはあなたのループで

for i in 0 ..< kid_list.count { ...

+0

self.attendanceInfo.removeAll()それはうまく働いています。..... ..... – naga

+0

あなたは大歓迎です。私たちはそのロッキーの間違いを経験しました。がんばり続ける! –