JSONデータを解析した後、表形式で表示します。初めてうまく動作します。テーブルビューのセルには、3つのボタン(in、out、absent)がありました。いずれかのボタンをクリックすると、他のJSON APIを呼び出すことができます。 JSONからデータを取得した後、テーブルビューを更新して新しいデータを再ロードする必要がありますが、いずれかのボタンテーブルビューをクリックするとデータが繰り返されます。スクロールするとuitableviewデータが繰り返される
どのように私はこの問題を克服していますか?これはコードです:
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
})
}
表データを更新した後、データが繰り返され、ビューとテーブルリロードする。
サイドノートに入る直前に
self.attendanceInfo.removeAll()
を追加します:あなたはあなたのコードを改善するために、 'ガードlet'文をチェックアウトする必要があります。これらの ''あれば ''と ''中かっこ ''は、コードを不必要に長くして読みにくいものにします。 – LinusGeffarthこれを行うと 'attendance.standard'、'出席 'はどこから来ますか? –
'cellForRowAt'メソッドはコンパイルされません。テーブルビューでの予期しないデータの繰り返しは、UI要素が 'if'条件で変更され、デフォルト値を割り当てるための' else'節を追加しない場合に発生します。 – vadian