Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UISegmentedControl in each UITableViewCell of UITableView

Tags:

xcode

ios

swift

I'm trying to implement UISegmentedControl in each dequeueReusableCell UITableViewCell like so:

App Screenshot
The Issue: Each TableViewCell is referencing to the same Segmented Control and I'm unable to fetch the state of the control for any cell in particular. As per my understanding, there's only one instance of SegmentedControl that is being initialised and that instance is being shared by all the TableViewCells, and because of that I can't access the unique value of the state for any particular TableViewCell, eg: I'm unable to access what the SegmentControl state is set to for the 3rd cell.

View Controller Code:

import UIKit
import UserNotifications

class MarkAttendanceViewController: UIViewController {


    var pickedDate: Date = Date.init()

    override func viewDidLoad() {
        super.viewDidLoad()
        if #available(iOS 13.0, *) {
            overrideUserInterfaceStyle = .light
        }
    }

    @IBAction func datePicker(_ sender: UIDatePicker) {

    pickedDate = sender.date.addingTimeInterval(19800)
    let weekDay = Calendar(identifier:.gregorian).component(.weekday, from: pickedDate)
    print(weekDay)

    updateSubjects(pickedDate)
    }

    func updateSubjects(_ pickedDate: Date) {

    }

}

extension MarkAttendanceViewController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "subjectCell", for: indexPath) as! SubjectTableViewCell
        cell.SessionType.text = "Lecture"
        cell.SessionName.text = "Network Security"
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
    }
}

class SubjectTableViewCell: UITableViewCell {
    @IBOutlet var SessionType: UILabel!
    @IBOutlet var SessionName: UILabel!

    @IBOutlet var segmentControlOutlet: UISegmentedControl!
    @IBAction func segmentedControlIndex(_ sender: UISegmentedControl) {
        print(sender.selectedSegmentIndex)
    }
}

Github Link here
Please let me know if there's any more information that I need to provide or if the question isn't clear. TIA

like image 471
Harshit Jindal Avatar asked Dec 05 '22 09:12

Harshit Jindal


2 Answers

You should set the tag of your segmentControlOutlet to indexPath.row in cellForRowAt:IndexPath method.
Also you must add an action on valueChange event on each of your UISegmentedControl in the same method.
below code might give you some idea:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "subjectCell", for: indexPath) as! SubjectTableViewCell
        cell.SessionType.text = "Lecture"
        cell.SessionName.text = "Network Security"

        // add an action on value change to detect a change in the value of segmented control
        cell.segmentControlOutlet.addTarget(self, action: #selector(segmentValueChanged(_:)), for: .valueChanged)

        // set the tag property of your segmented control to uniquely identify each segmented control in the value change event
        cell.segmentControlOutlet.tag = indexPath.row

        return cell
    }  

and you can distinguish among various instances of UISegmentedControl using the tag property that you set inside the cellForRow method.

@objc func segmentValueChanged(_ sender: UISegmentedControl) {

    switch sender.tag {
    case 0:
        // do something on value changed in segmented control in first cell and so on...
        print(sender.tag)
    default:
        break
    }

    print(sender.selectedSegmentIndex)
}  

Hope this helps

like image 179
S1LENT WARRIOR Avatar answered May 22 '23 09:05

S1LENT WARRIOR


Use this toterial. add UITableViewCell to your project and set UISegment action in custom UITableViewCell

enter image description here

enter image description here

enter image description here

enter image description here

like image 20
Sina Avatar answered May 22 '23 09:05

Sina