我正在尝试使用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
}
}