从用户 ID 旁边的 UI 滑块获取值(将用户链接到部分编号?)

Getting Values from UISliders alongside UserID (linking User to section number?)

我正在努力在我的应用程序中创建一个 'Rate' 功能,它可以吸引用户从外部 API 进行评分。然后我创建了一个 TableView,它添加了包含部分名称(用户名称)和 UISlider 的单元格。

我想做的是从 UISliders 收集数据以及与所在部分的用户关联的用户 ID,以便我可以调用 POST 操作 API 也发送评分数据。

这是我的代码:(作为记录,第一次使用 Swift,评论是我试图弄清楚如何做到这一点)。有什么想法吗?

import UIKit
import Alamofire


class RateViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var submitButton: UIButton!
    @IBOutlet weak var activeSurveyLabel: UILabel!


    private var myTableView: UITableView!
    var usersToRate = [User]()
    var activeSurveyId: String?
    var rateData = [String: Int]()
    var sectionIdToUserId = [Int: String]()
    var userIdSection = [Int: String]()

    override func viewDidLoad() {
        super.viewDidLoad()

        submitButton.isHidden = true

        submitButton.addTarget(self, action: #selector(pressSubmitButton(button:)), for: UIControlEvents.touchUpInside)

        activeSurveyLabel.isHidden = false


        self.loadUsersToRate()


        Alamofire.request(RateRouter.getSurvey()).responseJSON { response in
            debugPrint(response)


            if let string = response.result.value as? [[String: Any]]{

                if string.count == 0 {
                    return
                }

                self.submitButton.isHidden = false
                self.activeSurveyLabel.isHidden = true

                for survey in string {
                    if let survey = Survey(json: survey) {
                        self.activeSurveyId = survey._id!
                        print(survey._id!)
                    }
                }


                //if there's a result, show slider bars for each person on the team with rating scales (except for the person logged in)
                //have a submit button with a post request for the votes

                let barHeight: CGFloat = UIApplication.shared.statusBarFrame.size.height
                let displayWidth: CGFloat = self.view.frame.width
                let displayHeight: CGFloat = barHeight * CGFloat(self.usersToRate.count * 5)

                self.myTableView = UITableView(frame: CGRect(x: 0, y: barHeight, width: displayWidth, height: displayHeight - barHeight))
                self.myTableView.register(UITableViewCell.self, forCellReuseIdentifier: "MyCell")
                self.myTableView.dataSource = self
                self.myTableView.delegate = self
                self.view.addSubview(self.myTableView)


            } else {
                print(response.result.error!)
                let label = UILabel()
                label.center = self.view.center
                label.text = "No Active Surveys"
                self.view.addSubview(label)
            }

        }




        // Do any additional setup after loading the view.
    }

    func loadUsersToRate() {
        Alamofire.request(RateRouter.getUsers()).responseJSON { response in
            guard let jsonArray = response.result.value as? [[String: Any]] else {
                print("didn't get array, yo")
                return
            }

            for item in jsonArray {
                if let user = User(json: item) {
                    self.usersToRate.append(user)

                    self.rateData.updateValue(5, forKey: user.userId!) //initialize user average data at 5 in case they don't change it
                    print (self.rateData)
                }
            }
        }
    }


    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("Num: \(indexPath.row)")
        print("Value: \(usersToRate[indexPath.row])")

    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }


    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

        self.sectionIdToUserId.updateValue(usersToRate[section].userId!, forKey: section)
        print(self.sectionIdToUserId)
        return "\(usersToRate[section].name!)"
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return usersToRate.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath as IndexPath)

        let slider = UISlider(frame: CGRect(x: 0, y:0, width: 400, height: 44))
        slider.isUserInteractionEnabled = true
        slider.minimumValue = 1
        slider.maximumValue = 10
        slider.value = 5
        slider.tag = indexPath.section
        slider.addTarget(self, action: #selector(sliderValueChange(sender:)), for: UIControlEvents.valueChanged)
        cell.addSubview(slider)


        return cell
    }

    func sliderValueChange(sender: UISlider) {
        //get slider value
        var currentValue = Int(sender.value)
        print(currentValue)

        //self.rateData.updateValue(currentValue, forKey: self.sectionIdToUserId.values[sender.])



        //get user id for that value
        //self.rateData.updateValue(currentValue, rateData[section])



       // self.rateData.updateValue(currentValue, forKey: 0)
    }

    func pressSubmitButton(button: UIButton) {


        for user in usersToRate {
          //   Alamofire.request(RateRouter.vote(voteFor: user.userId!, survey: activeSurveyId, rating:))
        }



    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}

为了回答我自己的问题,我所做的是创建一个名为 'Votes' 的不同模型来存储每次投票的信息。

然后为了填充该数组,我根据部分 ID 在 tableView 中为滑块创建了一个标签,并使用它来更新当前值。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath as IndexPath)

    let slider = UISlider(frame: CGRect(x: 0, y:0, width: cell.frame.width , height: 44))

    slider.tag = indexPath.section
    slider.addTarget(self, action: #selector(sliderValueChange(sender:)), for: UIControlEvents.valueChanged)
    cell.addSubview(slider)


    return cell
}

func sliderValueChange(sender: UISlider) {
    //get slider value
    var currentValue = Int(sender.value)
    print(currentValue)

    voteData[sender.tag].rating = currentValue
}