You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift实现TableView第三分区各年龄组出勤总数统计(无需新增控制器)

问题详情

当前实现情况

以下是目前已实现功能的截图:

Image

需求目标

在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)
                        }
                    })
                }
            }
        }
    }
}
解决方案说明
  1. 隐藏第三分区增减按钮:在cellForRowAt方法中判断当前分区为第三分区时,设置增减按钮为隐藏状态,且不为其添加点击事件,避免无效交互。

  2. 自动计算总数:新增updateTotalAttendance方法,遍历Male和Female分区的所有数值并累加,更新第三分区的总数后刷新对应行;同时在增减按钮点击事件末尾调用该方法,确保总数实时更新。

  3. 修复API参数问题:原代码中total参数传入的是数组,改为取数组第一个元素,符合API参数格式要求。

  4. 初始化总数:在viewDidLoad中调用总数计算方法,确保页面加载时总数正确显示。

内容的提问来源于stack exchange,提问作者user20925367

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 23:20:42