ios - UITableView 的每个 UITableViewCell 中的 UISegmentedControl

标签 ios swift xcode

我正在尝试在每个 dequeueReusableCell UITableViewCell 中实现 UISegmentedControl,如下所示:

App Screenshot
问题:每个 TableViewCell 都引用同一个分段控件,我无法获取任何单元格的控件状态。据我了解,只有一个 SegmentedControl 实例正在初始化,并且该实例由所有 TableViewCells 共享,因此我无法访问任何特定 TableViewCell 的状态的唯一值,例如:我'我无法访问为第 3 个单元格设置的 SegmentControl 状态。

查看 Controller 代码:

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
如果我需要提供更多信息或者问题不清楚,请告诉我。时间差

最佳答案

您应该在 cellForRowAt:IndexPath 方法中将 segmentControlOutlettag 设置为 indexPath.row。< br/> 此外,您还必须使用相同的方法在每个 UISegmentedControl 上添加对 valueChange 事件的操作。
下面的代码可能会给你一些想法:

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
    }  

并且您可以使用在 cellForRow 方法中设置的 tag 属性来区分 UISegmentedControl 的各种实例。

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

希望对你有帮助

关于ios - UITableView 的每个 UITableViewCell 中的 UISegmentedControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57238836/

相关文章:

ios - 超过最大触摸次数使得程序不调用touchesEnded方法?

ios - iOS 中的中文字体渲染

ios - ViewController 委托(delegate)方法未从 AppDelegate 触发

ios - 如何从 UIViewController 对不同 swift 文件的引用中调用它的函数?

swift - 将注释标题传递给 View Controller (快速)

ios - 将 linphone 集成到 iOS

ios - IOS中一个UIView两次添加到另一个UIView会发生什么?

ios - React Native 如何访问 iOS 字典来提取单词的定义?

xcode - react 原生环境 : node: No such file or directory

xcode - 如何在 cocos2d 中简单地更改 Sprite 的图像?