Swift实现TableView第三分区各年龄组出勤总数统计(无需新增控制器)
问题详情
当前实现情况
以下是目前已实现功能的截图:

需求目标
在TableView的第三分区显示各年龄组的出勤总数。
已尝试方案
- 尝试用新变量
itemValue2 = ["0"]结合增减按钮的计数逻辑实现求和,但应用崩溃; - 尝试新增控制器实现,问题依旧。
现存问题
TableView第三分区仍重复显示增减按钮,无法仅展示出勤总数。
相关代码
import UIKit import ObjectiveC import SSSpinnerButton class AdditionalGuestInforTVCell: UITableViewCell { @IBOutlet weak var lblName: UILabel! @IBOutlet weak var lblDetails: UILabel! @IBOutlet var btnMinus: UIButton! @IBOutlet var lblValue: UILabel! @IBOutlet var btnPlus: UIButton! } class AdditionalGuestInformationVC: UIViewController, UITableViewDelegate, UITableViewDataSource { let section = ["Male", "Female", "total"] let itemsName = [["Shishu", "Baal", "Kishore", "Tarun", "Yuva", "Jyeshta"], ["Shishu", "Baalika", "Kishori", "Taruni", "Yuvati", "Jyeshtaa"], ["Total:"]] let itemsDetails = [["Below 5 Years - Pre-primary ", "5 to 11 Years - Primary School", "11 to 16 Years - Middle School", "17 to 25 Years - High School/College", "25 to 60 Years - Adults", ">60 Years - Senior citizen"], ["Below 5 Years - Pre-primary ", "5 to 11 Years - Primary School", "11 to 16 Years - Middle School", "17 to 25 Years - High School/College", "25 to 60 Years - Adults", ">60 Years - Senior citizen"],["Attendees"]] var itemValue = [["0", "0", "0", "0", "0", "0"], ["0", "0", "0", "0", "0", "0"], ["0"]] var dicMember = [[String:Any]]() var strDate = "" var utsavName = "" @IBOutlet weak var tableView: UITableView! @IBOutlet var lblShakhaName: UILabel! @IBOutlet var lblDate: UILabel! @IBOutlet var btnSubmit: SSSpinnerButton! override func viewDidLoad() { super.viewDidLoad() self.fillData() // 初始化计算总数 updateTotalAttendance() } override func viewWillAppear(_ animated: Bool) { navigationBarDesign(txt_title: "guest_information".localized, showbtn: "back") self.firebaseAnalytics(_eventName: "AdditionalGuestInfoVC") } func fillData() { self.lblDate.text = strDate } @objc func onMinusClick(_ sender: UIButton) { let sectionIndex = ((sender.tag / 10) - 10) let rowIndex = (sender.tag % 10) let indexPath = NSIndexPath(row: rowIndex, section: sectionIndex) let cell = tableView.cellForRow(at: indexPath as IndexPath) as? AdditionalGuestInforTVCell var strVal : Int = Int((cell?.lblValue.text)!)! if strVal > 0 { strVal -= 1 } self.itemValue[sectionIndex][rowIndex] = "\(Int(strVal))" tableView.reloadRows(at:[indexPath as IndexPath], with:.automatic) // 更新总数 updateTotalAttendance() } @objc func onPlusClick(_ sender: UIButton) { let sectionIndex = ((sender.tag / 10) - 10) let rowIndex = (sender.tag % 10) let indexPath = NSIndexPath(row: rowIndex, section: sectionIndex) let cell = tableView.cellForRow(at: indexPath as IndexPath) as? AdditionalGuestInforTVCell var strVal : Int = Int((cell?.lblValue.text)!)! if strVal < 99 { strVal += 1 } self.itemValue[sectionIndex][rowIndex] = "\(Int(strVal))" tableView.reloadRows(at:[indexPath as IndexPath], with:.automatic) // 更新总数 updateTotalAttendance() } @IBAction func onPreviewClick(_ sender: UIButton) { let storyBoard = UIStoryboard(name: "Main", bundle: nil) let vc = storyBoard.instantiateViewController(withIdentifier: "AttendancePreviewVC") as! AttendancePreviewVC vc.itemsName = self.itemsName vc.itemsDetails = self.itemsDetails vc.itemValue = self.itemValue vc.dicMember = self.dicMember self.navigationController?.pushViewController(vc, animated: true) } @IBAction func onSubmitClick(_ sender: UIButton) { btnSubmit.startAnimate(spinnerType: SpinnerType.circleStrokeSpin, spinnercolor: .white, spinnerSize: 20, complete: { self.addSankhyaAPI() let disableMyButton = sender as? UIButton disableMyButton?.isEnabled = false }) } // MARK: TableView Methods func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return self.section[section] } func numberOfSections(in tableView: UITableView) -> Int { return self.section.count } func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let rect = CGRect(x: 20, y: 0, width: tableView.frame.size.width - 40, height: 60) let footerView = UIView(frame:rect) footerView.backgroundColor = UIColor.init(red: 229.0/255.0, green: 229.0/255.0, blue: 229.0/255.0, alpha: 1.0) let lblTitle = UILabel(frame: CGRect(x: 20.0, y: footerView.center.y / 2, width: 160, height: 30)) lblTitle.text = "Guest Information" lblTitle.font = UIFont(name: "SourceSansPro-Regular", size: 20.0) lblTitle.backgroundColor = UIColor.clear lblTitle.textColor = UIColor.init(red: 154.0/255.0, green: 154.0/255.0, blue: 154.0/255.0, alpha: 1.0) let lblGender = UILabel(frame: CGRect(x: 30.0 + lblTitle.frame.width, y: footerView.center.y / 2, width: 80, height: 30)) lblGender.text = self.section[section] lblGender.font = UIFont(name: "SourceSansPro-SemiBold", size: 16.0) lblGender.textColor = UIColor.black lblGender.backgroundColor = UIColor.init(red: 255.0/255.0, green: 230.0/255.0, blue: 190.0/255.0, alpha: 1.0) lblGender.layer.cornerRadius = 15.0 lblGender.layer.masksToBounds = true lblGender.textAlignment = .center footerView.addSubview(lblGender) footerView.addSubview(lblTitle) return footerView } func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 60 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.itemsName[section].count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "AdditionalGuestInforTVCell", for: indexPath) as! AdditionalGuestInforTVCell cell.lblName.text = self.itemsName[indexPath.section][indexPath.row] cell.lblDetails.text = self.itemsDetails[indexPath.section][indexPath.row] cell.lblValue.text = self.itemValue[indexPath.section][indexPath.row] // 第三分区隐藏增减按钮 if indexPath.section == 2 { cell.btnMinus.isHidden = true cell.btnPlus.isHidden = true } else { cell.btnMinus.isHidden = false cell.btnPlus.isHidden = false cell.btnMinus.addTarget(self, action: #selector(onMinusClick(_:)), for: .touchUpInside) cell.btnPlus.addTarget(self, action: #selector(onPlusClick(_:)), for: .touchUpInside) let strSection : String = "\(indexPath.section + 10)" let strRow = "\(indexPath.row)" cell.btnPlus.tag = Int(strSection + strRow)! cell.btnMinus.tag = Int(strSection + strRow)! cell.lblValue.tag = Int(strSection + strRow)! } return cell } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension } // 计算并更新总出勤数 func updateTotalAttendance() { var total = 0 // 累加Male分区数值 for valueStr in itemValue[0] { if let value = Int(valueStr) { total += value } } // 累加Female分区数值 for valueStr in itemValue[1] { if let value = Int(valueStr) { total += value } } // 更新第三分区总数并刷新行 itemValue[2][0] = "\(total)" let totalIndexPath = IndexPath(row: 0, section: 2) tableView.reloadRows(at: [totalIndexPath], with: .automatic) } func addSankhyaAPI() { let arrFilter : [String] = self.dicMember.filter { $0["isPresent"] as! String == "true" }.map { $0["member_id"]! as! String } let stringArr = arrFilter.joined(separator: " ") let stringArray = stringArr.replacingOccurrences(of: " ", with: ", ", options: .literal, range: nil) var parameters: [String: Any] = [:] parameters["user_id"] = _appDelegator.dicMemberProfile![0]["user_id"] as? String parameters["event_date"] = strDate parameters["org_chapter_id"] = _appDelegator.dicMemberProfile![0]["shakha_id"] parameters["utsav"] = utsavName parameters["member_id"] = stringArray parameters["shishu_male"] = self.itemValue[0][0] parameters["baal"] = self.itemValue[0][1] parameters["kishore"] = self.itemValue[0][2] parameters["tarun"] = self.itemValue[0][3] parameters["yuva"] = self.itemValue[0][4] parameters["proudh"] = self.itemValue[0][5] parameters["shishu_female"] = self.itemValue[1][0] parameters["baalika"] = self.itemValue[1][1] parameters["kishori"] = self.itemValue[1][2] parameters["taruni"] = self.itemValue[1][3] parameters["yuvati"] = self.itemValue[1][4] parameters["proudha"] = self.itemValue[1][5] // 修复total参数格式 parameters["total:"] = self.itemValue[2][0] parameters["api"] = "yes" print(parameters) APIManager.sharedInstance.callPostApi(url: APIUrl.add_sankhya, parameters: parameters) { (jsonData, error) in if error == nil { if let status = jsonData!["status"].int { if status == 1 { self.btnSubmit.stopAnimationWithCompletionTypeAndBackToDefaults(completionType: .success, backToDefaults: true, complete: { if let strMessage = jsonData!["message"].string { showAlert(title: APP.title, message: strMessage) } }) }else { self.btnSubmit.stopAnimationWithCompletionTypeAndBackToDefaults(completionType: .fail, backToDefaults: true, complete: { if let strError = jsonData!["message"].string { showAlert(title: APP.title, message: strError) } }) } } else { self.btnSubmit.stopAnimationWithCompletionTypeAndBackToDefaults(completionType: .fail, backToDefaults: true, complete: { if let strError = jsonData!["message"].string { showAlert(title: APP.title, message: strError) } }) } } } } }
解决方案说明
隐藏第三分区增减按钮:在
cellForRowAt方法中判断当前分区为第三分区时,设置增减按钮为隐藏状态,且不为其添加点击事件,避免无效交互。自动计算总数:新增
updateTotalAttendance方法,遍历Male和Female分区的所有数值并累加,更新第三分区的总数后刷新对应行;同时在增减按钮点击事件末尾调用该方法,确保总数实时更新。修复API参数问题:原代码中
total参数传入的是数组,改为取数组第一个元素,符合API参数格式要求。初始化总数:在
viewDidLoad中调用总数计算方法,确保页面加载时总数正确显示。
内容的提问来源于stack exchange,提问作者user20925367
相关产品推荐
相关产品推荐

