在动态UITableView中使用多个UIPickerViews

时间:2020-07-22 19:00:33

标签: ios swift uitableview uipickerview

我正在尝试使用UIPickerViews,以便用户可以在1到20之间选择一个“数量”(数字)。在我的TableviewCell中有一个标签和选择器。 在实现PickerViewDelegate和PickerViewDatasource之前,一切都很好。从那时起,我什至无法检查我的代码是否正确,因为它为具有数组soloJobs(数组不为空)的标签给出了“致命错误:意外发现nil ...”。所以我想我从根本上犯了错。

最后,我的目标是将jobAmountPicker的值存储在给定索引的selAmountArray中。

也许有人可以帮忙。

这是我的tableviewcell:

import UIKit

var globalAmount:[String] = []

class ProjectCharacterTableViewCell: UITableViewCell,  UIPickerViewDelegate, UIPickerViewDataSource {
    
    
    
    
    var jobAmount: [String] = []
    var pickerData = ["1", "2", "3", "4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"]
    var selAmountArray: [String] = []

    
    static let identifier = "ProjectCharacterTableViewCell"
    
    @IBOutlet weak var jobLabel: UILabel!
    @IBOutlet weak var jobAmountPicker: UIPickerView!
    

     override func awakeFromNib() {
        self.pickerData = Array<String>()
        self.jobAmountPicker.delegate = self;
        self.jobAmountPicker.delegate = self;
        super.awakeFromNib()
    }
    
     override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return pickerData.count
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
           return 1
       }
    
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent  component: Int) {
        let selectedAmount = pickerData[row] as String
        selAmountArray.append(selectedAmount)
        globalAmount = selAmountArray
    }
       

       func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
           return pickerData[row]
       }
}

那是我的viewController:

import UIKit
import FirebaseDatabase
import Foundation
import FirebaseFirestoreSwift
import CodableFirebase

class ProjectCharacterViewController: UIViewController, UITextFieldDelegate {
    
    
    
// MARK: - Properties
    
   
    @IBOutlet weak var specTxt: UITextField!
    @IBOutlet weak var difficultyTxt: UITextField!
    @IBOutlet weak var budgetTxt: UITextField!
    @IBOutlet weak var tableView: UITableView!
    
  
    var soloJobs: [String] = []
    var jobAmount: [String] = []
    var rowBeingEditet : Int? = nil
    var indexesNeedPicker: [NSIndexPath]?
    var i: Int?
  

    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        getJobs(for: User.current) { (memberJob) in
        }
        
    }
    

    override func viewDidLoad() {
        
        tableView.register(ProjectCharacterTableViewCell.self, forCellReuseIdentifier: "ProjectCharacterTableViewCell")

        super.viewDidLoad()

    }

    

// MARK: - Functions
         
    
    func getJobs(for user: User, completion: @escaping ([MemberJobsStruct]) -> Void) {
        
         var jobs: [String] = []

         let ref = Database.database().reference().child("team").child(user.uid)
        
                 ref.observe(DataEventType.value, with: { snapshot in

                    for case let child as DataSnapshot in snapshot.children {
                    guard let value = child.value as? [String: Any] else {
                        return completion ([])
                        
                }
                        let memberJob = value["memberJob"] as! String
                        jobs.append(memberJob)
                        self.soloJobs = self.removeDuplicates(array: jobs)
                        DispatchQueue.main.async {
                                   self.tableView.reloadData()
                               }
                    }
                 })
    }
    
  
func removeDuplicates(array: [String]) -> [String] {
    var encountered = Set<String>()
    var result: [String] = []
    for value in array {
        if encountered.contains(value) {
            // Do not add a duplicate element.
        }
        else {
            // Add value to the set.
            encountered.insert(value)
            // ... Append the value.
            result.append(value)
        }
    }
    return result
    }  
    
    @IBAction func show(_ sender: Any) {
        
        print("SoloJobs: ", soloJobs)
        print("Thats the job amount: ", jobAmount)
        print("Global amount :", globalAmount)
    }
    
}



// MARK: - UITableViewDataSource

extension ProjectCharacterViewController: UITableViewDataSource {

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      
    
        let cell = tableView.dequeueReusableCell(withIdentifier: "ProjectCharacterTableViewCell") as! ProjectCharacterTableViewCell
        cell.jobLabel.text = soloJobs[indexPath.row]
        i = indexPath.row
        
        cell.jobAmountPicker.reloadAllComponents();
           return cell
        }
    
}

// MARK: - UITableViewDelegate

extension ProjectCharacterViewController: UITableViewDelegate {

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

0 个答案:

没有答案