简体   繁体   中英

PickerView inside tableView cell

I have created a tableview which takes date difference and create that number of tableview cell, each table view cell consist of textview and and picker view against textview to pick value. The problem is when i pick value for the 1 position using PickerView then the selected value is also reflected on the other cell

code for the contorller
here hfDetailsArr contains total number of days difference

 --function for getting date difference count  {
  let dateFormatter = DateFormatter()

                    dateFormatter.dateFormat = "dd/MM/yyyy"
                    let currentCalendar = NSCalendar.current

                    dateFormatter.date(from: dateFormatter.string(from:date1 as Date))

                    let temp = currentCalendar.dateComponents([.day], from:  dateFormatter.date(from: dateFormatter.string(from:date1 as Date))!, to:  dateFormatter.date(from: dateFormatter.string(from:date2 as Date))!)

                    hfDetailsArr.removeAllObjects();
                    //print(temp.day!)

                    if !(temp.day! < 0) && (temp.day! != 0) {
                    for i in 0 ..< (temp.day! + 1){
                        let HFDetailsDates = currentCalendar.date(byAdding: .day, value: i, to: date1 as Date)
                        DataDetails = dateFormatter.string(from: HFDetailsDates!)
                        hfDetailsArr.add(DataDetails)
                         ApplyForDate.append( dateFormatter.string(from: HFDetailsDates!) + ",")

                        }
                //print(ApplyForDate)
                    }
            HFDEtailsTable.reloadData()

}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if hfDetailsArr.count < 0 && hfDetailsArr.count != 0 {
        return 0
    }else{
    return hfDetailsArr.count

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

    let cell : HFDetailsCell! = tableView.dequeueReusableCell(withIdentifier: "cell") as! HFDetailsCell

    cell.txtHFDateFeild.text = hfDetailsArr[indexPath.row] as? String
       cell.cellDelegate = self
    return cell

}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("indeddsdsd \(indexPath.row)")

}

code for UITableview cell with pickerview inside it

protocol HFDetailsCellDelegate : class {
    func ValueSelectedChage(sender:HFDetailsCell ,Id:String ,selectedCell:String)
}

class HFDetailsCell: UITableViewCell,UITextFieldDelegate,UIPickerViewDelegate,UIPickerViewDataSource{

    @IBOutlet var txtHFPicker: UITextField!
    @IBOutlet var txtHFDateFeild: UITextField!
   @IBOutlet  var pickerView: UIPickerView! = UIPickerView()
   var HfDtailsOneArr = ["Select","Full Day Leave","Half Day Leave"]
    var position = 0
    //var intHFStatusDetail = ""
   /// internal static var HFtableView = UITableView()
    weak var cellDelegate: HFDetailsCellDelegate?
  //var LeaveDataIDArr = [String?]()

    override func awakeFromNib() {
        txtHFDateFeild.delegate = self
        pickerView.delegate = self
        txtHFPicker.inputView  = pickerView
        pickerView.backgroundColor = UIColor.white
        super.awakeFromNib()
        // Initialization code


    }

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

        // Configure the view for the selected state
    }

    @IBAction func txtleaveType(_ sender: UITextField) {



    }


 //print("buttonclick")

//    //UIpickerView
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    //Set number of rows in components

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

        return self.HfDtailsOneArr.count

    }
    //Set title for each row
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

        return HfDtailsOneArr[row]


    }
    // Update textfield text when row is selected
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
         //  self.cellDelegate?.ValueSelectedChage(sender:self, Id: HFDetailsLeaveCount(position: row), selectedCell: "")
        txtHFPicker.text = HfDtailsOneArr[row]
       print("pickerText:\(txtHFPicker.text!)")

    }
        func HFDetailsLeaveCount(position:Int)-> String {

            switch position {
            case 0:
                return "0"
            case 1:
                return "8"
            case 2:
                return "4"
            default:
                return "nil"
            }

    }
 }

图片1

图片2

in above image if i select value for date 04/08 then the same value is reflected for 12/08

-- any kind of help will be appreciated. Thank you

in table cell, on picker selection call ValueSelectedChage delegate method

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
       self.cellDelegate?.ValueSelectedChage(sender:self, Id: HFDetailsLeaveCount(position: row), selectedCell: HfDtailsOneArr[row])
       txtHFPicker.text = HfDtailsOneArr[row]
       print("pickerText:\(txtHFPicker.text!)")
}

create a variable in viewcontroller to keep selected value

var hfSelectedDetails: [String: String?]?

in viewcontroller implement the delegate method

func ValueSelectedChage(sender:HFDetailsCell ,Id:String ,selectedCell:String) {
     let indexpath = self.tableView.indexPathForRowAtPoint(cell.center)
     let key = "\(indexpath.row)"
     hfSelectedDetails[key] = selectedCell
     ....//other code if any
}

and in cellForRow add

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

    let cell : HFDetailsCell! = tableView.dequeueReusableCell(withIdentifier: "cell") as! HFDetailsCell

    cell.txtHFDateFeild.text = hfDetailsArr[indexPath.row] as? String
    cell.cellDelegate = self
    let key = "\(indexPath.row)"
    if let selectedValue = hfSelectedDetails[key] {
        cell.txtHFPicker.text = selectedValue
    } else {
        cell.txtHFPicker.text = nil
    }
    return cell

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM