Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用Swift从CollectionView单元格中获取手动输入的数据并将其存储在对象数组中_Ios_Swift_Uicollectionview_Uicollectionviewcell - Fatal编程技术网

Ios 使用Swift从CollectionView单元格中获取手动输入的数据并将其存储在对象数组中

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

我不熟悉iOS和Swift

我无法获取在UICollectionView单元格中的多个UITextField中手动输入的数据

我希望在用户开始编辑文本时,从每个文本字段连续获取数据,然后将其推入对象中的变量中

单元格样本-将有多个单元格

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] = []
    
  • 在模型类中创建init方法:

  • 通过SampleViewController扩展中的
    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