【发布时间】:2021-06-18 23:28:35
【问题描述】:
大家好,我正在使用UICollectionView,它显示 19 个单元格。
单元格显示时间列表
我通过模型 (TimeSelModel) 管理我的数据
TimeSelModel.swift
struct Section<T> { let dataModel: [T] }
struct TimeSelModel {
let hour: Int
let minute: Int
var time: String { "\(hour):\(minute)" }
var cellInteraction: Bool = true
}
let dataSec0 = [ // Dati della sezione 0
TimeSelModel(hour: 09, minute: 30),
TimeSelModel(hour: 10, minute: 00),
TimeSelModel(hour: 10, minute: 30),
TimeSelModel(hour: 11, minute: 00),
TimeSelModel(hour: 11, minute: 30),
TimeSelModel(hour: 15, minute: 00),
TimeSelModel(hour: 15, minute: 30),
TimeSelModel(hour: 16, minute: 00),
TimeSelModel(hour: 16, minute: 30),
TimeSelModel(hour: 17, minute: 00)
]
let dataSec1 = [ // Dati della sezione 1
TimeSelModel(hour: 12, minute: 00),
TimeSelModel(hour: 12, minute: 30),
TimeSelModel(hour: 13, minute: 00),
TimeSelModel(hour: 14, minute: 00),
TimeSelModel(hour: 14, minute: 30),
TimeSelModel(hour: 17, minute: 30),
TimeSelModel(hour: 18, minute: 00),
TimeSelModel(hour: 18, minute: 30),
TimeSelModel(hour: 19, minute: 00)
]
var cellInteraction 分配collectionView 的单元格的isUserInteractionEnable 状态
在包含collectionView的UIView类中,我创建了一个管理单元格交互的函数,即所有包含时间低于当前时间的单元格必须有cellInteraction == false
TimeSelView.swift
private var data: [Section<TimeSelModel>] = []
private func isPreviousTime(_ values: (Int, Int)) -> Bool {
guard let time = Calendar.current.date(bySettingHour: values.0, minute: values.1, second: 0, of: Date()) else {
// Non è stato possibile determinare l'orario prescelto
return false
}
return time < Date()
}
// MARK: Update Cell Status
private func updateCellStatus() {
var sec: Int = 0
var hour: Int = 0
var minute: Int = 0
(0..<data.count).forEach { (section) in
sec = section
(0..<data[section].dataModel.count).forEach { (values) in
hour = data[section].dataModel[values].hour
minute = data[section].dataModel[values].minute
data[section].dataModel[values].cellInteraction = isPreviousTime((hour, minute)) ? false : true
}
}
cv.reloadData()
// GET FIRST INDEX WHERE cellInteraction == TRUE
if let index = data[sec].dataModel.firstIndex(where: { $0.cellInteraction }) {
cv.selectItem(at: IndexPath(item: index, section: sec), animated: false, scrollPosition: [])
print(sec)
// SEC is always 1 .. this is wrong
}
}
从图片中可以看出,一切正常,但我在选择时遇到了问题。
我需要获取collectionView 的firstIndex,其中cellInteraction == TRUE.
从我展示的图像中,您应该选择包含时间 11:30 的单元格,而不是继续选择包含 12:00 的单元格,这是因为它总是一直在循环中返回第 1 节,我不明白为什么
此时我哪里错了?为什么它应该(在这种情况下)返回第 0 节并选择包含 11:30 的单元格时总是返回第 1 节?
在自定义单元格类中,我将 cellInteraction 的值分配给单元格的 isUserInteractionEnable
TimeSelCell.swift
class TimeSelCell: UICollectionViewCell {
static let cellID = "time.selector.cell.identifier"
private let minuteLbl = UILabel(font: .systemFont(ofSize: 13), textColor: .white, textAlignment: .center)
private let hourLbl = UILabel(font: .boldSystemFont(ofSize: 17), textColor: .white, textAlignment: .center)
var dataModel: TimeSelModel! {
didSet {
hourLbl.text = String(format: "%02d", dataModel.hour)
minuteLbl.text = ":" + String(format: "%02d", dataModel.minute)
isUserInteractionEnabled = dataModel.cellInteraction
contentView.alpha = dataModel.cellInteraction ? 1 : 0.5
}
}
【问题讨论】:
-
您在
for循环内将section分配给sec,因此sec将具有section的终止值,即1 -
@Paulw11 那么我怎样才能得到正确的部分呢?
-
我猜你可以使用另一个
for循环来遍历你的部分,当你找到一个可以选择的单元格时,你可以使用break。 -
@Paulw11 你能给我一个关于我的代码的例子以便更好地理解吗?
标签: ios model-view-controller uiview uicollectionview uicollectionviewcell