Ios 使用Swift从CollectionView单元格中获取手动输入的数据并将其存储在对象数组中
我不熟悉iOS和Swift 我无法获取在UICollectionView单元格中的多个UITextField中手动输入的数据 我希望在用户开始编辑文本时,从每个文本字段连续获取数据,然后将其推入对象中的变量中 单元格样本-将有多个单元格Ios 使用Swift从CollectionView单元格中获取手动输入的数据并将其存储在对象数组中,ios,swift,uicollectionview,uicollectionviewcell,Ios,Swift,Uicollectionview,Uicollectionviewcell,我不熟悉iOS和Swift 我无法获取在UICollectionView单元格中的多个UITextField中手动输入的数据 我希望在用户开始编辑文本时,从每个文本字段连续获取数据,然后将其推入对象中的变量中 单元格样本-将有多个单元格 class Singleton{ static let shared = Singleton() var list = [CellFields].self } class CellFields { var button1:bool var button
class Singleton{
static let shared = Singleton()
var list = [CellFields].self
}
class CellFields {
var button1:bool
var button2:bool
var dropdown:String
var field1:String
var field2:String
var field3:String
var label1:String
var label2:String
}
Singleton.shared.list
[0]
dropdown = "Dropdown"
field1 = "Something"
field2 = "Random"
field3 = "Another"
label1 = "Label"
label2 = "Label2"
button1 = true
button2 = false
[1]
dropdown = "Dropdown1"
field1 = "Something1"
field2 = "Random2"
field3 = "Another3"
label1 = "Label4"
label2 = "Label3"
button1 = false
button2 = true
...
...
...
例如,上面链接中提供的图像是一个单元格示例,该单元格包含多个文本字段、标签和按钮
现在我想从每个单元格中获取所有数据,并将其存储在一个对象数组中
我的ViewController
extension SampleViewController:UICollectionViewDelegate,UICollectionViewDataSource, UICollectionViewDelegateFlowLayout{
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 10
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell=collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! SampleCollectionViewCell;
return cell;
}
}
我的模型对象类
class Singleton{
static let shared = Singleton()
var list = [CellFields].self
}
class CellFields {
var button1:bool
var button2:bool
var dropdown:String
var field1:String
var field2:String
var field3:String
var label1:String
var label2:String
}
Singleton.shared.list
[0]
dropdown = "Dropdown"
field1 = "Something"
field2 = "Random"
field3 = "Another"
label1 = "Label"
label2 = "Label2"
button1 = true
button2 = false
[1]
dropdown = "Dropdown1"
field1 = "Something1"
field2 = "Random2"
field3 = "Another3"
label1 = "Label4"
label2 = "Label3"
button1 = false
button2 = true
...
...
...
我的UICollectionViewCell
class MySampleCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var dropdown: DropDown!
@IBOutlet weak var field1: UITextField!
@IBOutlet weak var field2: UITextField!
@IBOutlet weak var field3: UITextField!
@IBOutlet weak var label1: UILabel!
@IBOutlet weak var label2: UILabel!
@IBOutlet weak var button1: UIButton!
@IBOutlet weak var button2: UIButton!
}
我已经尝试了所有的委托方法,但仍然无法实现我想要的
我想要达到的结果与此类似
class Singleton{
static let shared = Singleton()
var list = [CellFields].self
}
class CellFields {
var button1:bool
var button2:bool
var dropdown:String
var field1:String
var field2:String
var field3:String
var label1:String
var label2:String
}
Singleton.shared.list
[0]
dropdown = "Dropdown"
field1 = "Something"
field2 = "Random"
field3 = "Another"
label1 = "Label"
label2 = "Label2"
button1 = true
button2 = false
[1]
dropdown = "Dropdown1"
field1 = "Something1"
field2 = "Random2"
field3 = "Another3"
label1 = "Label4"
label2 = "Label3"
button1 = false
button2 = true
...
...
...
let classFieldSets: [ClassFields] = []
cellForItemAt
将它们传递到单元格创建类似于以下内容的内容:
// create your own delegate type for the cell
protocol MyCellDelegate {
func myTextFieldChanged(_ tf: UITextField) // call when the textfield changes
func myOtherTextFieldChanged(_ tf: UITextField) // call when the other textfield changes
func myToggleChanged(_ sw: UISwitch) // call when the switch changes
}
class MyCell: UICollectionViewCell {
@IBOutlet private var myTextField: UITextField!
@IBOutlet private var myOtherTextField: UITextField!
@IBOutlet private var myToggle: UISwitch!
private var _delegate: MyCellDelegate? // instance of above protocol type, this will generally be your VC
func initialize(withDelegate delegate: MyCellDelegate) {
myTextField.delegate = self
myOtherTextField.delegate = self
self._delegate = delegate // a textfield uses a delegate pattern
self.myToggle.addTarget(self, action: #selector(toggleValueChanged(_:)), for: .valueChanged) // a switch uses this target/selector pattern
}
}
// I like putting delegate implementations in extensions
extension MyCell: UITextFieldDelegate {
// called when a textfield changes
func textFieldDidEndEditing(_ textField: UITextField) {
if textField == myTextField {
_delegate?.myTextFieldChanged(textField) // call the protocol's method to signal the VC of the change
}
if textField == myOtherTextField {
_delegate?.myOtherTextFieldChanged(textField) // call the protocol's method to signal the VC of the change
}
}
}
extension MyCell {
// @objc is required for the target/selector pattern
@objc func toggleValueChanged(_ toggle: UISwitch) {
if toggle == myToggle {
_delegate?.myToggleChanged(toggle)
}
}
}
然后在VC的cellForItemAt中:
let cell=collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! SampleCollectionViewCell;
cell.initialize(withDelegate: self)
return cell;
在你的VC中,将其设置为MyCellDelegate
:
extension SampleViewController: MyCellDelegate{
func myTextFieldChanged(_ tf: UITextField) {
// save new textfield value
}
func myOtherTextFieldChanged(_ tf: UITextField) {
// save new other textfield value
}
func myToggleChanged(_ sw: UISwitch) {
// save new toggle value
}
}
理想情况下,您可以创建一个方法,一次更新整个表单,但这实际上取决于您拥有的数据类型以及哪些数据是可选的等等,我将把这作为一个挑战。但至少从这一点上,你应该能够让你的表格正常工作,并了解所有代表材料的情况。那么你有什么问题?@LingVu我想将我从各个字段输入的数据存储在每个单元格中,并在不同的控制器中使用。请阅读-总结是,这不是一种理想的解决问题的方法向志愿者讲话,可能会对获得答案产生反作用。“请不要将此添加到您的问题中。”哈弗指出。thanks@OnkarKalpavriksha您使用表单功能的表示技术的原因是什么?collectionview应该只显示数据,如果要保存更改,请执行正确的委托方法,这取决于要保存的数据。例如,如果你在collectionview中有一个textfield,那么让你的VC成为一个textFieldDelegate,并实现textDidChange方法(谷歌他们,这是我脑子里想不到的)。然后将你的vc作为代理分配给该字段。我不想将数据传递给单元格,而是想从所有单元格中提取数据并将其存储到数据库中。这不起作用。我没有得到一个错误,同时我也没有得到输出。我添加了print语句以签入“extension SampleViewController:MyCellDelegate{@onkalkapavriksha对了,您需要为单元格中的每个字段设置
textField.delegate=self
。很抱歉出现了htat