ios - UITableView 的每个 UITableViewCell 中的 UISegmentedControl
问题描述
我正在尝试UISegmentedControl
像dequeueReusableCell UITableViewCell
这样实现:
问题:每个 TableViewCell 都引用相同的分段控件,我无法获取任何特定单元格的控件状态。据我了解,只有一个 SegmentedControl 实例正在初始化,并且该实例由所有 TableViewCells 共享,因此我无法访问任何特定 TableViewCell 的状态的唯一值,例如:I' m 无法访问为第 3 个单元设置的 SegmentControl 状态。
查看控制器代码:
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
如果我需要提供更多信息或者问题不清楚,请告诉我。TIA
解决方案
你应该设置tag
你的segmentControlOutlet
to indexPath.row
incellForRowAt:IndexPath
方法。
此外,您必须以相同的方法valueChange
在每个事件上添加一个操作。
下面的代码可能会给你一些想法: UISegmentedControl
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
}
并且您可以区分UISegmentedControl
使用tag
您在cellForRow
方法中设置的属性的各种实例。
@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)
}
希望这可以帮助
推荐阅读
- python - FuzzyWuzzy 仅在烧瓶应用程序中引发 TypeError
- excel - ADODB 查询不检索日期
- javascript - React.js 等价于 this.id
- java - 泛型类中的广泛类型擦除
- shell - 如何打印文件中某个字段小于某个输入值的所有行
- r - R如何比较重复的两列
- css - 实现视频背景后如何删除页脚和页眉的边距?
- node.js - 如何在 Mongoose Schema 中要求嵌套的 json 对象
- bash - cd 到包含存储在 macOS 上 Bash 中的变量中的空格的路径
- javascript - Javascript在临时数组中存储最大长度的数组