iOS 如何知道按下了哪个按钮 CollectionView 与自定义委托
iOS how know which button is pressed CollectionView with custom delegate
所以我在 collectionview 中有一个单元格,里面有 3 个按钮。为了使用这些按钮触发代码,我实现了一个自定义委托。现在正在触发代码,但我不知道代码是从哪个单元格触发的。我怎样才能最好地实现这一点?这是我的一些代码。
协议:
protocol OverViewDelegate {
func registerButtonClicked()
func evaluateButtonClicked()
func overviewButtonClicked()
}
cellForItemAt:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "sessionCell", for: indexPath) as? SessionCollectionViewCell
let session: SessionModel
session = DebugData.shared.sessionArray[indexPath.row]
cell?.sessionImage.image = #imageLiteral(resourceName: "carControl")
cell?.sessionNameLabel.text = session.name
cell?.sessionLocationLabel.text = session.location
cell?.overViewDelegate = self
return cell!
}
单元格:
import UIKit
导入 IBAnimatable
@IBOutlet weak var sessionImage: UIImageView!
@IBOutlet weak var sessionNameLabel: UILabel!
@IBOutlet weak var sessionLocationLabel: UILabel!
@IBOutlet weak var sessionRegisterButton: AnimatableButton!
@IBOutlet weak var sessionOverviewButton: AnimatableButton!
@IBOutlet weak var sessionEvaluateButton: AnimatableButton!
var overViewDelegate: OverViewDelegate?
@IBAction func registerButtonClicked(_ sender: Any) {
overViewDelegate?.registerButtonClicked()
}
@IBAction func overviewButtonClicked(_ sender: Any) {
overViewDelegate?.overviewButtonClicked()
}
@IBAction func evaluateButtonClicked(_ sender: Any) {
overViewDelegate?.evaluateButtonClicked()
}
如有任何帮助,我们将不胜感激。
在 cellForItemAt:
方法中,您可以指定 tag
值,当点击按钮时,您可以检查 sender.tag
以检查哪个按钮被点击。
您可以通过为 cellForItemAt 中的所有按钮添加标签来实现它:如下所示
cell.sessionRegisterButton.tag = indexPath.item
cell.sessionOverviewButton.tag = indexPath.item
cell.sessionEvaluateButton.tag = indexPath.item
并通过 :
取回索引
@IBAction func registerButtonClicked(_ sender: Any) {
let senderButton : UIButton = sender as! UIButton
let index : Int = senderButton.tag
overViewDelegate?.registerButtonClicked()
}
@IBAction func overviewButtonClicked(_ sender: Any) {
let senderButton : UIButton = sender as! UIButton
let index : Int = senderButton.tag
overViewDelegate?.overviewButtonClicked()
}
@IBAction func evaluateButtonClicked(_ sender: Any) {
let senderButton : UIButton = sender as! UIButton
let index : Int = senderButton.tag
overViewDelegate?.evaluateButtonClicked()
}
在您的单元格中放置一个变量,并在 cellForRowAt
中保存您的会话数据模型实例。然后更新您的委托方法并为每个方法添加一个会话参数。
所以每次按下按钮时都有数据模型的实例
您可以在 cellForItemAt:
中使用按钮标签进行检查
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "sessionCell", for: indexPath) as? SessionCollectionViewCell
cell.YOUR_BUTTON.tag = indexPath.item
return cell!
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "sessionCell", for: indexPath) as? SessionCollectionViewCell
let session: SessionModel
session = DebugData.shared.sessionArray[indexPath.row]
cell.sessionRegisterButton.tag = indexPath.row // --- add this
..........
cell?.sessionImage.image = #imageLiteral(resourceName: "carControl")
cell?.sessionNameLabel.text = session.name
cell?.sessionLocationLabel.text = session.location
cell?.overViewDelegate = self
return cell!
}
@IBAction func registerButtonClicked(_ sender: Any) {
let cellIndex = sender.tag // this will be the cell index
overViewDelegate?.registerButtonClicked()
}
在单元格中传递 indexPath 值 class return 在按钮点击功能上返回 indexPath
协议:-
protocol OverViewDelegate {
func registerButtonClicked(_ indexPath : IndexPath)
func evaluateButtonClicked(_ indexPath : IndexPath)
func overviewButtonClicked(_ indexPath : IndexPath)
}
cellForItemAt:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "sessionCell", for: indexPath) as? SessionCollectionViewCell
let session: SessionModel
session = DebugData.shared.sessionArray[indexPath.row]
cell?.sessionImage.image = #imageLiteral(resourceName: "carControl")
cell?.sessionNameLabel.text = session.name
cell?.sessionLocationLabel.text = session.location
cell?.overViewDelegate = self
cell?.indexPath = indexPath
return cell!
}
单元格:
@IBOutlet weak var sessionImage: UIImageView!
@IBOutlet weak var sessionNameLabel: UILabel!
@IBOutlet weak var sessionLocationLabel: UILabel!
@IBOutlet weak var sessionRegisterButton: AnimatableButton!
@IBOutlet weak var sessionOverviewButton: AnimatableButton!
@IBOutlet weak var sessionEvaluateButton: AnimatableButton!
var overViewDelegate: OverViewDelegate?
var indexPath : IndexPath?
@IBAction func registerButtonClicked(_ sender: Any) {
overViewDelegate?.registerButtonClicked(indexPath)
}
@IBAction func overviewButtonClicked(_ sender: Any) {
overViewDelegate?.overviewButtonClicked(indexPath)
}
@IBAction func evaluateButtonClicked(_ sender: Any) {
overViewDelegate?.evaluateButtonClicked(indexPath)
}
获取单元格使用:-
let cell = tableView.cellForRow(at: indexPath)
最好的方法是在协议方法中发回信元..
例如
protocol OverViewDelegate {
func registerButtonClicked(cell: SessionCollectionViewCell)
func evaluateButtonClicked(cell: SessionCollectionViewCell)
func overviewButtonClicked(cell : SessionCollectionViewCell)
}
点击按钮
@IBAction func overviewButtonClicked(_ sender: Any) {
overViewDelegate?.overviewButtonClicked(cell: self)
}
在你 viewcontroller 实现委托方法时
func overviewButtonClicked(cell: SessionCollectionViewCell) {
// here you get the cell and all the properties you want to access of that cell and also
if let indexPath = self.tableView.indexPath(for: cell) {
// do what you want to do
}
}
所以我在 collectionview 中有一个单元格,里面有 3 个按钮。为了使用这些按钮触发代码,我实现了一个自定义委托。现在正在触发代码,但我不知道代码是从哪个单元格触发的。我怎样才能最好地实现这一点?这是我的一些代码。 协议:
protocol OverViewDelegate {
func registerButtonClicked()
func evaluateButtonClicked()
func overviewButtonClicked()
}
cellForItemAt:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "sessionCell", for: indexPath) as? SessionCollectionViewCell
let session: SessionModel
session = DebugData.shared.sessionArray[indexPath.row]
cell?.sessionImage.image = #imageLiteral(resourceName: "carControl")
cell?.sessionNameLabel.text = session.name
cell?.sessionLocationLabel.text = session.location
cell?.overViewDelegate = self
return cell!
}
单元格:
import UIKit
导入 IBAnimatable
@IBOutlet weak var sessionImage: UIImageView!
@IBOutlet weak var sessionNameLabel: UILabel!
@IBOutlet weak var sessionLocationLabel: UILabel!
@IBOutlet weak var sessionRegisterButton: AnimatableButton!
@IBOutlet weak var sessionOverviewButton: AnimatableButton!
@IBOutlet weak var sessionEvaluateButton: AnimatableButton!
var overViewDelegate: OverViewDelegate?
@IBAction func registerButtonClicked(_ sender: Any) {
overViewDelegate?.registerButtonClicked()
}
@IBAction func overviewButtonClicked(_ sender: Any) {
overViewDelegate?.overviewButtonClicked()
}
@IBAction func evaluateButtonClicked(_ sender: Any) {
overViewDelegate?.evaluateButtonClicked()
}
如有任何帮助,我们将不胜感激。
在 cellForItemAt:
方法中,您可以指定 tag
值,当点击按钮时,您可以检查 sender.tag
以检查哪个按钮被点击。
您可以通过为 cellForItemAt 中的所有按钮添加标签来实现它:如下所示
cell.sessionRegisterButton.tag = indexPath.item
cell.sessionOverviewButton.tag = indexPath.item
cell.sessionEvaluateButton.tag = indexPath.item
并通过 :
取回索引@IBAction func registerButtonClicked(_ sender: Any) {
let senderButton : UIButton = sender as! UIButton
let index : Int = senderButton.tag
overViewDelegate?.registerButtonClicked()
}
@IBAction func overviewButtonClicked(_ sender: Any) {
let senderButton : UIButton = sender as! UIButton
let index : Int = senderButton.tag
overViewDelegate?.overviewButtonClicked()
}
@IBAction func evaluateButtonClicked(_ sender: Any) {
let senderButton : UIButton = sender as! UIButton
let index : Int = senderButton.tag
overViewDelegate?.evaluateButtonClicked()
}
在您的单元格中放置一个变量,并在 cellForRowAt
中保存您的会话数据模型实例。然后更新您的委托方法并为每个方法添加一个会话参数。
所以每次按下按钮时都有数据模型的实例
您可以在 cellForItemAt:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "sessionCell", for: indexPath) as? SessionCollectionViewCell
cell.YOUR_BUTTON.tag = indexPath.item
return cell!
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "sessionCell", for: indexPath) as? SessionCollectionViewCell
let session: SessionModel
session = DebugData.shared.sessionArray[indexPath.row]
cell.sessionRegisterButton.tag = indexPath.row // --- add this
..........
cell?.sessionImage.image = #imageLiteral(resourceName: "carControl")
cell?.sessionNameLabel.text = session.name
cell?.sessionLocationLabel.text = session.location
cell?.overViewDelegate = self
return cell!
}
@IBAction func registerButtonClicked(_ sender: Any) {
let cellIndex = sender.tag // this will be the cell index
overViewDelegate?.registerButtonClicked()
}
在单元格中传递 indexPath 值 class return 在按钮点击功能上返回 indexPath
协议:-
protocol OverViewDelegate {
func registerButtonClicked(_ indexPath : IndexPath)
func evaluateButtonClicked(_ indexPath : IndexPath)
func overviewButtonClicked(_ indexPath : IndexPath)
}
cellForItemAt:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "sessionCell", for: indexPath) as? SessionCollectionViewCell
let session: SessionModel
session = DebugData.shared.sessionArray[indexPath.row]
cell?.sessionImage.image = #imageLiteral(resourceName: "carControl")
cell?.sessionNameLabel.text = session.name
cell?.sessionLocationLabel.text = session.location
cell?.overViewDelegate = self
cell?.indexPath = indexPath
return cell!
}
单元格:
@IBOutlet weak var sessionImage: UIImageView!
@IBOutlet weak var sessionNameLabel: UILabel!
@IBOutlet weak var sessionLocationLabel: UILabel!
@IBOutlet weak var sessionRegisterButton: AnimatableButton!
@IBOutlet weak var sessionOverviewButton: AnimatableButton!
@IBOutlet weak var sessionEvaluateButton: AnimatableButton!
var overViewDelegate: OverViewDelegate?
var indexPath : IndexPath?
@IBAction func registerButtonClicked(_ sender: Any) {
overViewDelegate?.registerButtonClicked(indexPath)
}
@IBAction func overviewButtonClicked(_ sender: Any) {
overViewDelegate?.overviewButtonClicked(indexPath)
}
@IBAction func evaluateButtonClicked(_ sender: Any) {
overViewDelegate?.evaluateButtonClicked(indexPath)
}
获取单元格使用:-
let cell = tableView.cellForRow(at: indexPath)
最好的方法是在协议方法中发回信元.. 例如
protocol OverViewDelegate {
func registerButtonClicked(cell: SessionCollectionViewCell)
func evaluateButtonClicked(cell: SessionCollectionViewCell)
func overviewButtonClicked(cell : SessionCollectionViewCell)
}
点击按钮
@IBAction func overviewButtonClicked(_ sender: Any) {
overViewDelegate?.overviewButtonClicked(cell: self)
}
在你 viewcontroller 实现委托方法时
func overviewButtonClicked(cell: SessionCollectionViewCell) {
// here you get the cell and all the properties you want to access of that cell and also
if let indexPath = self.tableView.indexPath(for: cell) {
// do what you want to do
}
}