Home > OS >  Saving TableView cells data (containing segment controller) using button
Saving TableView cells data (containing segment controller) using button

Time:09-17

I'm tired of searching about what I want, so I will ask here and hope you guys help if possible.

I have a tableview contain segments in each cell and I want to save all cells segment using button [outside the tableview] so I can show them in another table later.

Here is my tableview

here is my view Controller:

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    let arr = ["item 1",
               "item 2",
               "item 3"]

    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.register(CustomCell.self, forCellReuseIdentifier: "cell")
    }
    
    @IBAction func saveButtonAction(_ sender: UIButton) {
        
        // I want to save the cells segmented control selectedSegmentIndex???
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        90
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return arr.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomCell
        cell.textView.text = arr[indexPath.row]
        return cell
    }
}

and here is my Custom Cell and it contain TextView and Segment Controller I tried to save the segments changes in array but I don't know what to do after lol:

 import UIKit

 class CustomCell: UITableViewCell {

    let textView: UITextView = {
        let tv = UITextView()
        tv.translatesAutoresizingMaskIntoConstraints = false
        tv.font = UIFont.systemFont(ofSize: 16)
        tv.isEditable = false
        return tv
    }()
    
    // var rowIndexPath: Int?
    var segmentArray: [Int] = []
    
    lazy var itemSegmentedControl: UISegmentedControl = {
        let sc = UISegmentedControl(items: ["1", "2", "3"])
        sc.translatesAutoresizingMaskIntoConstraints = false
        sc.tintColor = UIColor.white
        sc.selectedSegmentIndex = 0
        sc.addTarget(self, action: #selector(handlePointChange), for: .valueChanged)
        return sc
    }()
    
    let stackView: UIStackView = {
        let sv = UIStackView()
        sv.translatesAutoresizingMaskIntoConstraints = false
        return sv
        
    }()
    
    @objc func handlePointChange() {
        
        let segChange = itemSegmentedControl.titleForSegment(at: itemSegmentedControl.selectedSegmentIndex)!
        segmentArray.append(Int(segChange)!)
        
    }
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }
    
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        
        stackView.addSubview(textView)
        stackView.addSubview(itemSegmentedControl)
        addSubview(stackView)
        
        stackView.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
        stackView.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
        stackView.widthAnchor.constraint(equalToConstant: 400).isActive = true
        stackView.heightAnchor.constraint(equalToConstant: 85).isActive = true
        
        itemSegmentedControl.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
        itemSegmentedControl.topAnchor.constraint(equalTo: textView.bottomAnchor, constant: 5).isActive = true
        itemSegmentedControl.widthAnchor.constraint(equalTo: textView.widthAnchor).isActive = true
        itemSegmentedControl.heightAnchor.constraint(equalToConstant: 40).isActive = true
        
        textView.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -10).isActive = true
        textView.topAnchor.constraint(equalTo: stackView.topAnchor).isActive = true
        textView.widthAnchor.constraint(equalTo: stackView.widthAnchor).isActive = true
        textView.heightAnchor.constraint(equalToConstant: 40).isActive = true
    }
 }

Regards and thanks.

CodePudding user response:

First: in the ViewController I added the empty array:

// I moved the segment array from the custom cell class to here
var segmentArray: [Int:Int] = [:]

override func viewDidLoad() {
    super.viewDidLoad()
    
    // I made this array to store default state to the items segments
    segmentArray = [0:0,1:0,2:0] 
}

// with this func I can update the segmentArray
func getSegmentNumber(r: Int, s: Int) {
    segmentArray[r] = Int(s)
}

@IBAction func saveButtonAction(_ sender: UIButton) {
    // Here I can save the new state for the segment to the firebase or anywhere.
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomCell
    cell.textView.text = arr[indexPath.row]

    // here to store the index path row
    cell.rowIndexPath = indexPath.row

    // you need to add the link because it won't work
    cell.link = self
    return cell
}

Second: in the Custom Cell Class:

// I removed the store array
var segmentArray: [Int] = [] // removed

// I made link to the ViewController
var link: ViewController?

// variable to get the index path row
var rowIndexPath: Int?

// here I can update the state of the segment using the link
@objc func handlePointChange() {
    
    let segChange = itemSegmentedControl.selectedSegmentIndex
    link?.getSegmentNumber(r: rowIndexPath!, s: segChange)
}

That worked for me, and I hope you got it. If you need anything you can ask.

Again thanks to Kudos. Regards to all

  • Related