Ios 在动态UITableView中使用多个UIPickerView

Ios 在动态UITableView中使用多个UIPickerView,ios,swift,uitableview,uipickerview,Ios,Swift,Uitableview,Uipickerview,我试图利用UIPickerViews,用户可以通过它选择1到20之间的“金额”(数字)。在myTableviewCell中有一个标签和选择器。 在我实现PickerViewDelegate和PickerViewDatasource之前,一切都很好。从那时起,我甚至无法检查我的代码是否正确,因为它为包含数组soloJobs(数组不是空的)的标签提供了“致命错误:意外发现零…”。所以我想我犯了一些根本错误 最后,我的目标是将jobamontecker的值存储在给定索引的selAmountArray中

我试图利用UIPickerViews,用户可以通过它选择1到20之间的“金额”(数字)。在my
TableviewCell
中有一个标签和选择器。 在我实现PickerViewDelegate和PickerViewDatasource之前,一切都很好。从那时起,我甚至无法检查我的代码是否正确,因为它为包含数组
soloJobs
(数组不是空的)的标签提供了“致命错误:意外发现零…”。所以我想我犯了一些根本错误

最后,我的目标是将
jobamontecker
的值存储在给定索引的
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]
       }
}
导入UIKit
变量globalAmount:[字符串]=[]
class ProjectCharacterTableViewCell:UITableViewCell、UIPickerViewElegate、UIPickerViewDataSource{
变量jobAmount:[字符串]=[]
变量pickerData=[“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”、“11”、“12”、“13”、“14”、“15”、“16”、“17”、“18”、“19”、“20”]
var selAmountArray:[字符串]=[]
静态let identifier=“ProjectCharacterTableViewCell”
@IBVAR弱var作业标签:UILabel!
@IBOUTLE弱var jobAmountPicker:UIPickerView!
重写func awakeFromNib(){
self.pickerData=Array()
self.jobamountcipker.delegate=self;
self.jobamountcipker.delegate=self;
super.awakeFromNib()
}
覆盖功能设置选定(uSelected:Bool,动画:Bool){
super.setSelected(选定,动画:动画)
//为所选状态配置视图
}
func pickerView(pickerView:UIPickerView,numberOfRowsInComponent:Int)->Int{
返回pickerData.count
}
func numberOfComponents(在pickerView:UIPickerView中)->Int{
返回1
}
func pickerView(pickerView:UIPickerView,didSelectRow行:Int,不完整组件:Int){
将selectedAmount=pickerData[row]设为字符串
selAmountArray.append(selectedAmount)
globalAmount=selAmountArray
}
func pickerView(pickerView:UIPickerView,titleForRow行:Int,forComponent组件:Int)->String{
返回选择器数据[行]
}
}
这就是我的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
    }
}
导入UIKit
导入FirebaseDatabase
进口基金会
导入FirebaseFirestoreSwift
导入CodableFirebase
类ProjectCharacterViewController:UIViewController、UIExtFieldDelegate{
//标记:-属性
@ibextfield:UITextField!
@IBOutlet弱var困难txt:UITextField!
@IBOutlet弱var budgetTxt:UITextField!
@IBVAR表格视图:UITableView!
var soloJobs:[字符串]=[]
变量jobAmount:[字符串]=[]
变量rowbeingeditt:Int?=nil
var indexesNeedPicker:[NSIndexPath]?
变量i:Int?
覆盖函数视图将出现(uo动画:Bool){
超级。视图将显示(动画)
getJobs(for:User.current){(memberJob)在
}
}
重写func viewDidLoad(){
tableView.register(ProjectCharacterTableViewCell.self,强制重用标识符:“ProjectCharacterTableViewCell”)
super.viewDidLoad()
}
//马克:-功能
func getJobs(对于用户:user,完成:@escaping([MemberJobsStruct])->Void){
变量作业:[String]=[]
设ref=Database.Database().reference().child(“团队”).child(user.uid)
ref.observe(DataEventType.value,带:{snapshot in
对于case,在snapshot.children中让child作为DataSnapshot{
guard let value=child.value作为?[String:Any]其他值{
返回完成([]))
}
让memberJob=value[“memberJob”]作为!字符串
jobs.append(memberJob)
self.soloJobs=self.removeDuplicates(数组:作业)
DispatchQueue.main.async{
self.tableView.reloadData()
}
}
})
}
func removeDuplicates(数组:[String])->[String]{
var=Set()
变量结果:[字符串]=[]
对于数组中的值{
如果遇到。包含(值){
//不要添加重复的元素。
}
否则{
//为集合添加值。
遇到。插入(值)
//…附加值。
result.append(值)
}
}
返回结果
}  
@iAction func show(\发送方:任意){
打印(“SoloJobs:”,SoloJobs)
打印(“这是作业金额:”,作业金额)
打印(“全局金额:”,全局金额)
}
}
//标记:-UITableViewDataSource
扩展项目CharacterViewController:UITableViewDataSource{
func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{
返回soloJobs.count
}
func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
将cell=tableView.dequeueReusableCell(标识符为:“ProjectCharacterTableViewCell”)设为!ProjectCharacterTableViewCell
cell.jobLabel.text=soloJobs[indexPath.row]
i=indexPath.row
cell.jobAmountPicker.reloadAllComponents();
返回单元
}
}
//标记:-UITableViewDelegate
扩展项目CharacterViewController:UITableViewDelegate{
func tableView(tableView:UITableView,heightForRowAt indexath:indexPath)->CGFloat{
返回60
}
}

那么,您在某一行上遇到崩溃,那么为什么要添加所有这些代码呢?还有,你已经划好了线。你有撞车记录吗?那么,y