为 collection 中的每个项目添加一个按钮
Add a button for each item in a collection
如何在我的 collection 中为每个可用项目添加一个按钮,而无需为每个项目编写一次代码?
这是我目前拥有的:
func drawInventory() {
if Person.inventory.itemsInBag[0].Id > 0 {
let itemButton1 = UIButton()
itemButton1.setImage(Person.inventory.itemsInBag[0].Image, for: .normal)
itemButton1.frame = CGRect(x: 300, y: 185, width: 30, height: 30)
itemButton1.addTarget(self, action: #selector(tapItemInInventory), for: .touchUpInside)
view.addSubview(itemButton1)
}
if Person.inventory.itemsInBag[1].Id > 0 {
let itemButton1 = UIButton()
itemButton1.setImage(Person.inventory.itemsInBag[1].Image, for: .normal)
itemButton1.frame = CGRect(x: 300+40, y: 185, width: 30, height: 30)
itemButton1.addTarget(self, action: #selector(tapItemInInventory2), for: .touchUpInside)
view.addSubview(itemButton1)
}
}
func tapItemInInventory() {
print(self.Person.inventory.itemsInBag[0].Name + "Pressed")
}
func tapItemInInventory2() {
print(self.Person.inventory.itemsInBag[1].Name + "Pressed")
}
func drawInventory() {
Person.inventory.itemsInBag.enumerated().filter { .Id > 0 }.enumerated().forEach { index, itemAndIndex in
let (itemPosition, item) = itemAndIndex
let itemButton = UIButton()
itemButton.setImage(item.Image, for: .normal)
itemButton.frame = CGRect(x: 300 + (40 * itemPosition), y: 185, width: 30, height: 30)
itemButton.addTarget(self, action: #selector(tapItemInInventory(_:)), for: .touchUpInside)
itemButton.tag = index
view.addSubview(itemButton)
}
}
dynamic func tapItemInInventory(_ button: UIButton) {
let item = Person.inventory.itemsInBag[button.tag]
print(item.Name + "Pressed")
}
这里,itemButton
的tag
属性用于标识它属于哪个项目。这是一种快速而肮脏的传递信息的方式,但对于这个简单的例子来说效果很好。
一个更好的解决方案是子类 UIButton
,添加一个 属性 来引用它相关的项目。
此外,enumerated()
被调用了两次。第一次,我们在 itemsInBag
数组中获取项目的索引。第二次,我们获取项目在屏幕上的位置,因为如果其 Id 小于 0,我们可能会丢弃一些项目。
如何在我的 collection 中为每个可用项目添加一个按钮,而无需为每个项目编写一次代码?
这是我目前拥有的:
func drawInventory() {
if Person.inventory.itemsInBag[0].Id > 0 {
let itemButton1 = UIButton()
itemButton1.setImage(Person.inventory.itemsInBag[0].Image, for: .normal)
itemButton1.frame = CGRect(x: 300, y: 185, width: 30, height: 30)
itemButton1.addTarget(self, action: #selector(tapItemInInventory), for: .touchUpInside)
view.addSubview(itemButton1)
}
if Person.inventory.itemsInBag[1].Id > 0 {
let itemButton1 = UIButton()
itemButton1.setImage(Person.inventory.itemsInBag[1].Image, for: .normal)
itemButton1.frame = CGRect(x: 300+40, y: 185, width: 30, height: 30)
itemButton1.addTarget(self, action: #selector(tapItemInInventory2), for: .touchUpInside)
view.addSubview(itemButton1)
}
}
func tapItemInInventory() {
print(self.Person.inventory.itemsInBag[0].Name + "Pressed")
}
func tapItemInInventory2() {
print(self.Person.inventory.itemsInBag[1].Name + "Pressed")
}
func drawInventory() {
Person.inventory.itemsInBag.enumerated().filter { .Id > 0 }.enumerated().forEach { index, itemAndIndex in
let (itemPosition, item) = itemAndIndex
let itemButton = UIButton()
itemButton.setImage(item.Image, for: .normal)
itemButton.frame = CGRect(x: 300 + (40 * itemPosition), y: 185, width: 30, height: 30)
itemButton.addTarget(self, action: #selector(tapItemInInventory(_:)), for: .touchUpInside)
itemButton.tag = index
view.addSubview(itemButton)
}
}
dynamic func tapItemInInventory(_ button: UIButton) {
let item = Person.inventory.itemsInBag[button.tag]
print(item.Name + "Pressed")
}
这里,itemButton
的tag
属性用于标识它属于哪个项目。这是一种快速而肮脏的传递信息的方式,但对于这个简单的例子来说效果很好。
一个更好的解决方案是子类 UIButton
,添加一个 属性 来引用它相关的项目。
此外,enumerated()
被调用了两次。第一次,我们在 itemsInBag
数组中获取项目的索引。第二次,我们获取项目在屏幕上的位置,因为如果其 Id 小于 0,我们可能会丢弃一些项目。