我正在使用UICollectionView和我的模型数据。 我准备了这个模型数据
struct Room {
let type: String
let position: String
var hidden: Bool?
static let typeA = "A"
static let typeB = "B"
static let typeC = "C"
static let positionA = "A"
static let positionB = "B"
static let positionC = "C"
static var rooms = [
Room(type: typeA, position: positionA, hidden: false),
Room(type: typeA, position: positionB, hidden: false),
Room(type: typeA, position: positionC, hidden: false),
Room(type: typeB, position: positionA, hidden: false),
Room(type: typeB, position: positionB, hidden: false),
Room(type: typeB, position: positionC, hidden: false),
Room(type: typeC, position: positionA, hidden: false),
Room(type: typeC, position: positionB, hidden: false),
Room(type: typeC, position: positionC, hidden: false)
]
}
用于UICollectionViewCells。我需要做的是切换hidden
bool值,以便它可以使用此
在cellForItemAtIndexPath
if Room.rooms[indexPath.row].hidden == true {
cell.layer.opacity = 0.5
}
并且这样做,我在Room
struct
static func toggleHidden(whichOne: String) {
if var roomType = rooms.type {
if roomType.type == whichOne || roomType.position == whichOne {
roomType.hidden = true
}
}
}
但它引发了一个错误:
Cannot assign to 'hidden' in 'roomType'
我可以做这样的事情
static func toggleHidden(whichOne: Int) {
(rooms[whichOne].hidden == false) ? (rooms[whichOne].hidden = true) : (rooms[whichOne].hidden = false)
}
但是,它需要按字符串过滤,以便可以一次切换多个项目。我正在做的是切换hidden
bool所有具有whichOne
字符串的项目。
这种方法首先不聪明吗?任何建议都会受到赞赏,提前谢谢。
答案 0 :(得分:1)
在roomType.hidden = true
中,您试图将true / false分配给String
类型的变量(typeA,typeB等是字符串)。
也许你的意思是room.hidden
。
将typeA的所有房间设置为隐藏:
var typeARooms = rooms.filter { $0.type == typeA }
for room in typeARooms { room.hidden = true }
collectionView.reloadData() // not animated
答案 1 :(得分:1)
这与Mundi的答案非常相似,但您应该执行以下操作
var typeARooms = Room.rooms.filter { $0.type == "A" }
for var i = 0; i < typeARooms.count; i++ {
var room = typeARooms[i]
room.hidden = true
}
For-in循环元素是只读的(让变量)。这就是为什么您需要明确使用var
来修改结构的原因。
答案 2 :(得分:0)
我这样结束了:
static func toggleHidden(whichOne: String) {
for index in 0..<rooms.count {
if rooms[index].type == whichOne || rooms[index].position == whichOne {
!rooms[index].isHidden ? (rooms[index].isHidden = true) : (rooms[index].isHidden = false)
}
}
}
希望我能缩短它但它才有效。这样,如果我执行self.collectionView?.reloadData()
,CollectionView会按预期应用更改
这是基于您的建议,非常感谢。