uitableViewcell 内的 UIPickerView
Posted
技术标签:
【中文标题】uitableViewcell 内的 UIPickerView【英文标题】:PickerView inside tableView cell 【发布时间】:2017-08-08 08:25:56 【问题描述】:我创建了一个表格视图,它采用日期差异并创建该数量的表格视图单元格,每个表格视图单元格由 textview 和针对 textview 的选取器视图组成以选取值。问题是当我使用 PickerView 为 1 位置选择值时,所选值也会反映在另一个单元格上
控制器代码 这里 hfDetailsArr 包含总天数差异
--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)")
内部带有pickerview的UITableview单元格代码
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"
在上图中,如果我选择 04/08 日期的值,那么 12/08 会反映相同的值
-- 任何形式的帮助将不胜感激。谢谢你
【问题讨论】:
这是因为单元格是可重复使用的。您可以谷歌如何处理这个问题,或者表格单元类 prepareForReuse() 中有一种方法。在此您设置 textView.text = "" 因此,当单元格被重用时,它不会采用以前的值,直到您提供一个。 @TusharSharma 我会试试这个,但是还有其他方法吗 是的,您需要 google 并找到对您有帮助的东西。有很多相关的问题。 你在 viewcontroller 的任何地方使用HFDetailsCellDelegate
吗?如果不实现委托方法ValueSelectedChage
来跟踪所选值,否则您将丢失单元格中的所选值。
【参考方案1】:
在表格单元格中,选择器选择调用ValueSelectedChage
委托方法
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!)")
在 viewcontroller 中创建一个变量以保持选定的值
var hfSelectedDetails: [String: String?]?
在视图控制器中实现委托方法
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
并在cellForRow
中添加
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
【讨论】:
以上是关于uitableViewcell 内的 UIPickerView的主要内容,如果未能解决你的问题,请参考以下文章
UITableViewCell 内的多个堆栈视图内的多行标签
UITableViewCell 内的 UIView 上的 UIGestureRecognizer
UITableViewCell 内的 UIStackView
如何增加 UItableviewcell 内的 UItableview 高度?