Swift: UICollectionViewCell 中的 UIButton 图像不会改变
Swift: UIButton image in UICollectionViewCell won't change
我是编码新手,请原谅我乱七八糟的代码。我正在尝试在点击该按钮时更改按钮的图像。该按钮位于 UICollectionViewCell 中,这让这有点棘手。
这是将按钮添加到单元格的位置:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
let d = self.data[indexPath.row].image
let button = UIButton(frame: CGRect(x:0, y:0, width:68,height:80))
button.setImage(d, for: UIControl.State.normal)
button.addTarget(self, action: #selector(buttonTapped), for: UIControl.Event.touchUpInside)
cell.addSubview(button)
return cell }
这是按钮从中获取图像的数据数组:
var data: [CustomData] = [CustomData]()
override func viewDidLoad() {
super.viewDidLoad()
self.data.append(CustomData(title: "abc", image: #imageLiteral(resourceName: "bookOne"), url: "typeURLa"))
self.data.append(CustomData(title: "def", image: #imageLiteral(resourceName: "bookTwo"), url: "typeURLb"))
self.data.append(CustomData(title: "ghi", image: #imageLiteral(resourceName: "bookThree"), url: "typeURLc"))
}
这是点击按钮时发生的情况:
@objc func buttonTapped(sender: UIButton!) {
print("button tapped")
let r = data[0]
print(sender.currentImage!)
print(r.image)
sender.setImage(r.image, for: UIControl.State.normal)
collectionView.reloadData()
print(sender.currentImage!)
print(r.image)
}
在调试控制台中,我可以看到它确实更新了按钮图像,但在模拟器中图像保持不变。
button tapped
<UIImage:0x600000adad90 named(main: bookTwo) {600, 754}>
<UIImage:0x600000adafd0 named(main: bookOne) {798, 1210}>
<UIImage:0x600000adafd0 named(main: bookOne) {798, 1210}>
<UIImage:0x600000adafd0 named(main: bookOne) {798, 1210}>
当我点击第 2 行中包含图像 "bookTwo" 的按钮时,我希望它更改为图像 "bookOne"。当我在第 2 行打印出按钮的图像时,我可以看到它在调试控制台中成功地将 "bookTwo" 更改为 "bookOne" 图像。 "bookOne"位于数组data[0],"bookTwo"位于data[1]。但是在屏幕上图像 "bookTwo" 仍然显示。
问题是您每次更新单元格后都重新加载 collectionView。每当您重新加载 collectionView 时,就会调用 collectionViewCellForItemAt 方法。但是在 collectionViewCellForItemAt 中,该方法已设置为将按钮中的图像写入数据数组 indexpath.row 中的图像。由于数据数组未更改,单元格被设置回数据数组给定的默认图像。
您可以改为更新代码。更新后的代码如下所示
@objc func buttonTapped(sender: UIButton!) {
print("button tapped")
let row = sender.tag
let intialData = data[row]
print(sender.currentImage!)
print(data[row].image)
data[row] = CustomData(title: intialData.title, image: #imageLiteral(resourceName: "bookOne"), url: intialData.url)
sender.setImage(data[row].image, for: UIControl.State.normal)
print(sender.currentImage!)
print(data[row].image)
}
在 collectionViewCellForItemAt 中添加这一行 button.tag = indexPath.row。更新后的代码如下所示
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
let d = self.data[indexPath.row].image
let button = UIButton(frame: CGRect(x:0, y:0, width:68,height:80))
button.setImage(d, for: UIControl.State.normal)
button.tag = indexPath.row
button.addTarget(self, action: #selector(buttonTapped), for: UIControl.Event.touchUpInside)
cell.addSubview(button)
return cell
}
我是编码新手,请原谅我乱七八糟的代码。我正在尝试在点击该按钮时更改按钮的图像。该按钮位于 UICollectionViewCell 中,这让这有点棘手。
这是将按钮添加到单元格的位置:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
let d = self.data[indexPath.row].image
let button = UIButton(frame: CGRect(x:0, y:0, width:68,height:80))
button.setImage(d, for: UIControl.State.normal)
button.addTarget(self, action: #selector(buttonTapped), for: UIControl.Event.touchUpInside)
cell.addSubview(button)
return cell }
这是按钮从中获取图像的数据数组:
var data: [CustomData] = [CustomData]()
override func viewDidLoad() {
super.viewDidLoad()
self.data.append(CustomData(title: "abc", image: #imageLiteral(resourceName: "bookOne"), url: "typeURLa"))
self.data.append(CustomData(title: "def", image: #imageLiteral(resourceName: "bookTwo"), url: "typeURLb"))
self.data.append(CustomData(title: "ghi", image: #imageLiteral(resourceName: "bookThree"), url: "typeURLc"))
}
这是点击按钮时发生的情况:
@objc func buttonTapped(sender: UIButton!) {
print("button tapped")
let r = data[0]
print(sender.currentImage!)
print(r.image)
sender.setImage(r.image, for: UIControl.State.normal)
collectionView.reloadData()
print(sender.currentImage!)
print(r.image)
}
在调试控制台中,我可以看到它确实更新了按钮图像,但在模拟器中图像保持不变。
button tapped
<UIImage:0x600000adad90 named(main: bookTwo) {600, 754}>
<UIImage:0x600000adafd0 named(main: bookOne) {798, 1210}>
<UIImage:0x600000adafd0 named(main: bookOne) {798, 1210}>
<UIImage:0x600000adafd0 named(main: bookOne) {798, 1210}>
当我点击第 2 行中包含图像 "bookTwo" 的按钮时,我希望它更改为图像 "bookOne"。当我在第 2 行打印出按钮的图像时,我可以看到它在调试控制台中成功地将 "bookTwo" 更改为 "bookOne" 图像。 "bookOne"位于数组data[0],"bookTwo"位于data[1]。但是在屏幕上图像 "bookTwo" 仍然显示。
问题是您每次更新单元格后都重新加载 collectionView。每当您重新加载 collectionView 时,就会调用 collectionViewCellForItemAt 方法。但是在 collectionViewCellForItemAt 中,该方法已设置为将按钮中的图像写入数据数组 indexpath.row 中的图像。由于数据数组未更改,单元格被设置回数据数组给定的默认图像。
您可以改为更新代码。更新后的代码如下所示
@objc func buttonTapped(sender: UIButton!) {
print("button tapped")
let row = sender.tag
let intialData = data[row]
print(sender.currentImage!)
print(data[row].image)
data[row] = CustomData(title: intialData.title, image: #imageLiteral(resourceName: "bookOne"), url: intialData.url)
sender.setImage(data[row].image, for: UIControl.State.normal)
print(sender.currentImage!)
print(data[row].image)
}
在 collectionViewCellForItemAt 中添加这一行 button.tag = indexPath.row。更新后的代码如下所示
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
let d = self.data[indexPath.row].image
let button = UIButton(frame: CGRect(x:0, y:0, width:68,height:80))
button.setImage(d, for: UIControl.State.normal)
button.tag = indexPath.row
button.addTarget(self, action: #selector(buttonTapped), for: UIControl.Event.touchUpInside)
cell.addSubview(button)
return cell
}