如何使用 swift 获取 UICollectionView 中的 cell atIndex?
How to get cell atIndex in UICollectionView with swift?
我正在以编程方式制作 Collection 视图。
这是 viewDidLoad func
中的代码
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20)
layout.itemSize = CGSize(width: 90, height: 120)
collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
collectionView!.dataSource = self
collectionView!.delegate = self
collectionView!.registerClass(CollectionViewCell.self, forCellWithReuseIdentifier: "CollectionViewCell")
collectionView!.layer.cornerRadius = 2
collectionView!.backgroundColor = UIColor.redColor()
self.containerView.addSubview(collectionView!)
这些是我的 collection 视图函数
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 8
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectionViewCell", forIndexPath: indexPath) as! CollectionViewCell
cell.backgroundColor = UIColor.blackColor()
cell.buttonView.addTarget(self, action: Selector("Action\(indexPath.row):"), forControlEvents: UIControlEvents.TouchUpInside)
return cell
}
想法是我在单元格中有一个按钮,当我按下它时单元格应该改变颜色,这是动作函数
func Action0(sender: UIButton!) {
var indexPath = NSIndexPath(forRow: 0, inSection: 0)
let cell = collectionView!.dequeueReusableCellWithReuseIdentifier("CollectionViewCell", forIndexPath: indexPath ) as! CollectionViewCell
cell.backgroundColor = UIColor.blueColor()
这是 collectionViewCell class,
class CollectionViewCell: UICollectionViewCell {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
var buttonView: UIButton!
override init(frame: CGRect) {
super.init(frame: frame)
buttonView = UIButton.buttonWithType(UIButtonType.System) as! UIButton
buttonView.frame = CGRect(x: 0, y: 16, width: frame.size.width, height: frame.size.height*2/3)
contentView.addSubview(buttonView)
}
}
按钮和动作有效,但单元格没有改变颜色,我想问题出在这一行
let cell = collectionView!.dequeueReusableCellWithReuseIdentifier("CollectionViewCell", forIndexPath: indexPath ) as! CollectionViewCell
这是获取给定 indexPath 处的单元格的方法:
let cell = collectionView!.cellForItemAtIndexPath(indexPath)
不过,您也可以尝试一下:
cell.contentView.backgroundColor = UIColor.blueColor()
注意:
虽然以上方法可能有效,但我还是想鼓励您尝试不同的实现来实现相同的功能。您的实现将要求您为每个 CollectionViewCell 提供一个单独的 Action# 函数,并在每个方法中手动创建 indexPath,而您可能只有一个!
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectionViewCell", forIndexPath: indexPath) as! CollectionViewCell
cell.backgroundColor = UIColor.blackColor()
cell.buttonView.addTarget(self, action: Selector("action"), forControlEvents: UIControlEvents.TouchUpInside)
return cell
}
和那个方法的函数是这样的:
func action(sender: UIButton!) {
var point : CGPoint = sender.convertPoint(CGPointZero, toView:collectionView)
var indexPath = collectionView!.indexPathForItemAtPoint(point)
let cell = collectionView!.cellForItemAtIndexPath(indexPath)
cell.backgroundColor = UIColor.blueColor()
}
更新了 Swift 4.2
的动作函数
@objc func action(sender: Any){
print("tickedOffPressed !")
if let button = sender as? UIButton {
let point: CGPoint = button.convert(.zero, to: collectionView)
if let indexPath = collectionView!.indexPathForItem(at: point) {
let cell = collectionView!.cellForItem(at: indexPath)
cell?.backgroundColor = UIColor.blue
}
}
}
只是一个建议!编码愉快! :)
尝试cell.selected然后更改颜色
在 Swift 2 中,您可以获得以下行:
let point : CGPoint = sender.convertPoint(CGPointZero, toView:myTableView)
let indexPath = myTableView.indexPathForRowAtPoint(point)
let cell = myTableView.cellForRowAtIndexPath(indexPath!)
在 Swift 4 中,您可以通过以下方式获取 CollectionView 的单元格:
let indexPath = IndexPath(item: 3, section: 0);
if let cell = myCollectionView .cellForItem(at: indexPath)
{
// do stuff...
}
适用于 Swift 5.5 和 iOS 15
添加 Lakhdeep Singh 答案,如果您想访问特定单元格的属性,您需要将其转换为您想要的单元格(例如 CustomCell)。例如,如果此 CustomCell 有一个 nameLabel,您可以像这样访问它:
let indexPath = IndexPath(item: 3, section: 0);
if let customCell = myCollectionView .cellForItem(at: indexPath) as? CustomCell {
customCell.nameLabel.text = "some text"
}
我正在以编程方式制作 Collection 视图。 这是 viewDidLoad func
中的代码let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20)
layout.itemSize = CGSize(width: 90, height: 120)
collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
collectionView!.dataSource = self
collectionView!.delegate = self
collectionView!.registerClass(CollectionViewCell.self, forCellWithReuseIdentifier: "CollectionViewCell")
collectionView!.layer.cornerRadius = 2
collectionView!.backgroundColor = UIColor.redColor()
self.containerView.addSubview(collectionView!)
这些是我的 collection 视图函数
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 8
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectionViewCell", forIndexPath: indexPath) as! CollectionViewCell
cell.backgroundColor = UIColor.blackColor()
cell.buttonView.addTarget(self, action: Selector("Action\(indexPath.row):"), forControlEvents: UIControlEvents.TouchUpInside)
return cell
}
想法是我在单元格中有一个按钮,当我按下它时单元格应该改变颜色,这是动作函数
func Action0(sender: UIButton!) {
var indexPath = NSIndexPath(forRow: 0, inSection: 0)
let cell = collectionView!.dequeueReusableCellWithReuseIdentifier("CollectionViewCell", forIndexPath: indexPath ) as! CollectionViewCell
cell.backgroundColor = UIColor.blueColor()
这是 collectionViewCell class,
class CollectionViewCell: UICollectionViewCell {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
var buttonView: UIButton!
override init(frame: CGRect) {
super.init(frame: frame)
buttonView = UIButton.buttonWithType(UIButtonType.System) as! UIButton
buttonView.frame = CGRect(x: 0, y: 16, width: frame.size.width, height: frame.size.height*2/3)
contentView.addSubview(buttonView)
}
}
按钮和动作有效,但单元格没有改变颜色,我想问题出在这一行
let cell = collectionView!.dequeueReusableCellWithReuseIdentifier("CollectionViewCell", forIndexPath: indexPath ) as! CollectionViewCell
这是获取给定 indexPath 处的单元格的方法:
let cell = collectionView!.cellForItemAtIndexPath(indexPath)
不过,您也可以尝试一下:
cell.contentView.backgroundColor = UIColor.blueColor()
注意:
虽然以上方法可能有效,但我还是想鼓励您尝试不同的实现来实现相同的功能。您的实现将要求您为每个 CollectionViewCell 提供一个单独的 Action# 函数,并在每个方法中手动创建 indexPath,而您可能只有一个!
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectionViewCell", forIndexPath: indexPath) as! CollectionViewCell
cell.backgroundColor = UIColor.blackColor()
cell.buttonView.addTarget(self, action: Selector("action"), forControlEvents: UIControlEvents.TouchUpInside)
return cell
}
和那个方法的函数是这样的:
func action(sender: UIButton!) {
var point : CGPoint = sender.convertPoint(CGPointZero, toView:collectionView)
var indexPath = collectionView!.indexPathForItemAtPoint(point)
let cell = collectionView!.cellForItemAtIndexPath(indexPath)
cell.backgroundColor = UIColor.blueColor()
}
更新了 Swift 4.2
的动作函数@objc func action(sender: Any){
print("tickedOffPressed !")
if let button = sender as? UIButton {
let point: CGPoint = button.convert(.zero, to: collectionView)
if let indexPath = collectionView!.indexPathForItem(at: point) {
let cell = collectionView!.cellForItem(at: indexPath)
cell?.backgroundColor = UIColor.blue
}
}
}
只是一个建议!编码愉快! :)
尝试cell.selected然后更改颜色
在 Swift 2 中,您可以获得以下行:
let point : CGPoint = sender.convertPoint(CGPointZero, toView:myTableView)
let indexPath = myTableView.indexPathForRowAtPoint(point)
let cell = myTableView.cellForRowAtIndexPath(indexPath!)
在 Swift 4 中,您可以通过以下方式获取 CollectionView 的单元格:
let indexPath = IndexPath(item: 3, section: 0);
if let cell = myCollectionView .cellForItem(at: indexPath)
{
// do stuff...
}
适用于 Swift 5.5 和 iOS 15
添加 Lakhdeep Singh 答案,如果您想访问特定单元格的属性,您需要将其转换为您想要的单元格(例如 CustomCell)。例如,如果此 CustomCell 有一个 nameLabel,您可以像这样访问它:
let indexPath = IndexPath(item: 3, section: 0);
if let customCell = myCollectionView .cellForItem(at: indexPath) as? CustomCell {
customCell.nameLabel.text = "some text"
}