Swift: использование Cosmos в UITableView - PullRequest
0 голосов
/ 16 июня 2020

Я хочу получить звездный рейтинг для опроса о производительности труда с использованием UITableView и Cosmos. Моя проблема в том, что я совершенно не понимаю, как я могу получить доступ и сохранить рейтинг, который пользователь дает для каждой строки.

Может кто мне поможет! :) Это то, что у меня есть ... Я пробовал так много разных возможностей, но всегда терпел неудачу. Я установил начальный рейтинг элементов на 0, который затем должен обновляться, как только пользователь оценит его, и в конечном итоге полностью сохраняется в Firebase, когда пользователь нажимает «сохранить»

import UIKit
import Cosmos
import TinyConstraints

protocol ClassTeamMemberRatingTableViewCelle {
func sharePressed(cell: TeamMemberRatingTableViewCell)
   func ratingDidChange(rating: Float)
}

public class TeamMemberRatingTableViewCell: UITableViewCell {

    @IBOutlet weak var itemLabel: UILabel!
    @IBOutlet weak var cosmos: CosmosView!

    var id: Int = 0

     func update(_ rating: Double, id: Int) {
       cosmos.rating = rating
       self.id = id

        cosmos.didFinishTouchingCosmos = { [weak self] rating in
         print(self?.id) // Access property here
       }
    }


    override public func prepareForReuse() {
      // Ensures the reused cosmos view is as good as new
      cosmos.prepareForReuse()
    }


    public override func awakeFromNib() {
           super.awakeFromNib()


    }

    public override func setSelected(_ selected: Bool, animated: Bool) {
          super.setSelected(selected, animated: animated)

          // Configure the view for the selected state
      }

    }

import UIKit
import FirebaseAuth
import FirebaseDatabase
import Cosmos
import TinyConstraints

class TeamMemberRatingViewController: UIViewController {


// MARK: - Properties

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var errorLabel: UILabel!





    var ratingItems: [RatingItem] = []
    var givenStars: Int = 0
    var userID:String?





    override func viewDidLoad() {
        super.viewDidLoad()

      ratingItems = createArray()
        setUpElements()


        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")



      }




    // MARK: - Element Style
    func setUpElements() {


         // Hide the error label
         errorLabel.alpha = 0

    }


    func configureTableView() {
        // remove separators for empty cells
       tableView.tableFooterView = UIView()
        // remove separators from cells
        tableView.separatorStyle = .none
    }

    // Error Handling for save
    func showError(_ message:String) {

        errorLabel.text = message
        errorLabel.alpha = 1
       }

    func createArray() -> [RatingItem] {
        var tempItems: [RatingItem] = []

        let item1 = RatingItem(item: "Ability", rating: 0)
        let item2 = RatingItem(item: "Accuracy", rating: 0)
        let item3 = RatingItem(item: "Planning", rating: 0)
        let item4 = RatingItem(item: "Quality of Work", rating: 0)
        let item5 = RatingItem(item: "Productivity", rating: 0)
        let item6 = RatingItem(item: "Punctuality", rating: 0)
        let item7 = RatingItem(item: "Responsibility", rating: 0)
        let item8 = RatingItem(item: "Job Knowledge", rating: 0)
        let item9 = RatingItem(item: "Creativity", rating: 0)
        let item10 = RatingItem(item: "Initiative", rating: 0)
        let item11 = RatingItem(item: "Job Commitment", rating: 0)
        let item12 = RatingItem(item: "Organization Loyalty", rating: 0)
        let item13 = RatingItem(item: "Supervisor Loyalty", rating: 0)
        let item14 = RatingItem(item: "Dependability", rating: 0)
        let item15 = RatingItem(item: "Honesty", rating: 0)
        let item16 = RatingItem(item: "Cooperation", rating: 0)
        let item17 = RatingItem(item: "Attitude", rating: 0)
        let item18 = RatingItem(item: "Communication Skilss", rating: 0)
        let item19 = RatingItem(item: "Judgment", rating: 0)
        let item20 = RatingItem(item: "Interpersonal Relationship", rating: 0)

        tempItems.append(item1!)
        tempItems.append(item2!)
        tempItems.append(item3!)
        tempItems.append(item4!)
        tempItems.append(item5!)
        tempItems.append(item6!)
        tempItems.append(item7!)
        tempItems.append(item8!)
        tempItems.append(item9!)
        tempItems.append(item10!)
        tempItems.append(item11!)
        tempItems.append(item12!)
        tempItems.append(item13!)
        tempItems.append(item14!)
        tempItems.append(item15!)
        tempItems.append(item16!)
        tempItems.append(item17!)
        tempItems.append(item18!)
        tempItems.append(item19!)
        tempItems.append(item20!)

        return tempItems

    }

    func validateFields() -> String? {

        return nil
    }



    @IBAction func saveRating(_ sender: Any) {

               let user = Auth.auth().currentUser
               if  let user = user {

                   let uid = user.uid
                   userID = uid

                   // Validate the fields
                   let error = validateFields()

                   if error != nil {

                       // There is something wrong with the fields, show error message
                       showError(error!)
                   } else {



//                    PostService.createProject(forprojectTitle: projectTitle)

                   }

               } else { self.showError("Please log out and log in again")}
        }


}



// MARK: - Extension

extension TeamMemberRatingViewController: UITableViewDataSource {


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


    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        let ratingItemT = ratingItems[indexPath.row]



       }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        // Fetches the appropriate meal for the data source layout.
        let ratingItemT = ratingItems[indexPath.row]


        let cell = tableView.dequeueReusableCell(withIdentifier: "TeamMemberRatingTableViewCell", for: indexPath) as! TeamMemberRatingTableViewCell


        cell.itemLabel.text = ratingItemT.item

        return cell
    }

}
// MARK: - UITableViewDelegate

extension TeamMemberRatingViewController: UITableViewDelegate {

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
     return 80
    }
}


import Foundation
import UIKit
import FirebaseDatabase.FIRDataSnapshot

class RatingItem {

    var key: String?

    var item: String
    var rating: Int

    init?(item: String, rating: Int) {

            // Initialization should fail if there is no name or if the rating is negative.
            // The name must not be empty
            guard !item.isEmpty else {
                return nil
            }

            // The rating must be between 0 and 5 inclusively
            guard (rating >= 0) && (rating <= 7) else {
                return nil
            }

            // Initialize stored properties.
            self.item = item
            self.rating = rating

        }
    var dictValue: [String: Any] {
        let createdAgo = kSecAttrCreationDate

        return ["Rating_Item" : item,
                "Rating_rating": rating,
                "created_ago": createdAgo]
    }
    init?(snapshot: DataSnapshot) {
        guard let dict = snapshot.value as? [String: Any],
        let item = dict["Rating_Item"] as? String,
        let rating = dict["Rating_rating"] as? Int

            else {return nil}

        self.key = snapshot.key
        self.item = item
        self.rating = rating

    }

}

Вот как это выглядит:

Table View

1 Ответ

0 голосов
/ 17 июля 2020

Я бы начал с вашего протокола и изменил его на следующий.

protocol ClassTeamMemberRatingTableViewCell {
    func sharePressed(cell: TeamMemberRatingTableViewCell)
    func ratingDidChange(for cell: TeamMemberRatingTableViewCell)
}

Из этого протокола вы можете получить доступ ко всем свойствам в ячейке (если они не являются частными), такими как метка заголовка, например «Планирование», вы также можете получить indexPath в ViewController. Оттуда вы можете вызвать функцию firebase для сохранения этих данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...