Извлечение вручную введенных данных из ячеек CollectionView и сохранение их в массиве объектов с помощью Swift - PullRequest
0 голосов
/ 12 декабря 2018

Я новичок в iOS и Swift.

Я не могу получить данные, которые я вручную ввел в несколько UITextFiled, присутствующих в ячейке в моем UICollectionView

Я хочу получитьданные из каждого текстового поля непрерывно, как только пользователь начинает редактировать текст и затем помещает его в переменную объекта.

Образец ячеек - будет несколько ячеек

Screen Shot

Например, изображение, представленное в приведенной выше ссылке, является образцом ячейки, эта ячейка содержит несколько текстовых полей, меток и кнопок

Теперь я хочу получить вседанные из каждой ячейки и сохраните их в массиве объекта

My 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
}

My 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!
}

Я перепробовал все методы делегата, но все еще не могу добиться того, чего хочу.

результат, который я хочу достичь, выглядит примерно так

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
...
...
...

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Создайте что-то похожее на следующее:

// 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)
        }
    }
}

Затем в cellForItemAt вашего ВК:

let cell=collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! SampleCollectionViewCell;
cell.initialize(withDelegate: self)
return cell;

А также в вашем ВК сделайте его 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
    }
}

В идеале вы должны создать один метод, который обновляет всю вашу форму сразу, но это действительно зависит от того, какие у вас есть данные, что является необязательным, и так далее, я оставлю это как вызов.Но, по крайней мере, из этого вы сможете заставить свою форму работать и понять, что происходит со всеми вещами делегатов.

0 голосов
/ 12 декабря 2018
  1. Вам не нужен синглтон для создания массива объектов класса:

    let classFieldSets: [ClassFields] = []
    
  2. Создайте метод init в вашем классе модели:

  3. Передайте их в ячейку через cellForItemAt в вашем расширении SampleViewController.

...