来自 tableViewCell 的快速@IBAction
Posted
技术标签:
【中文标题】来自 tableViewCell 的快速@IBAction【英文标题】:swift @IBAction from tableViewCell 【发布时间】:2017-10-19 10:50:22 【问题描述】:我需要通过点击一个tableViewCell来触发一个函数, 直到现在我使用@IBAction,但该选项仅适用于按钮类型(我还没有找到另一种方式..) 这就是我现在的方式:
@IBAction func springPrs(_ sender: Any)
//doing stuff..
但现在我有一个@IBOutlet
@IBOutlet weak var nextTrackCell: nextTableViewCell!
我想通过点击来触发一个功能。有什么帮助吗?
【问题讨论】:
【参考方案1】:这是一个错误的方法,你应该从UITableViewDelegate
实现一个名为didSelectRowAt
的委托方法:
public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
//do your stuff here.
【讨论】:
谢谢,但问题是我在表格视图之外创建了一个单元格,我是 swift 新手,我猜这不是正确的做法(我想知道缺点),但仍有办法吗? 是,这是做你想做的事情的正确方法。此外,您不应在 tableview 之外创建单元格。单元格是为与 tableview 一起使用而设计的,而不是单独使用。如果您使用的是单个单元格,请考虑改为通过 UIView 切换它 如何为 UIview 创建“onclick”功能? 这个答案会帮助你:***.com/questions/30505165/…【参考方案2】:您不应该将操作直接添加到表格视图单元格,因为它违反了 MVC 设计模式,并且 UITableViewDelegate
中已经内置了一个方便的回调来使这非常容易。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
if indexPath.row == 0
// do something when the top row tapped
else
// do something when any other row is tapped
【讨论】:
我认为override关键字会触发编译器错误。 @LuizFernandoSalvaterra 你是对的,我很抱歉。如果使用已经实现委托回调的UITableViewController
,那将是代码。
对,我也用这个方法哈哈哈【参考方案3】:
您也可以在单元格内声明一个闭包,这是我在必须将某些操作传递给视图控制器时倾向于使用的。
var onButtonPressed: (() -> ())?
@IBAction func buttonPressed(_ sender: Any)
onButtonPressed?()
并在cellForRowAt
中这样使用它:
cell.onButtonPressed = [unowned self] in
// Do what you need to, no need to capture self however, if you won't access it.
【讨论】:
以上是关于来自 tableViewCell 的快速@IBAction的主要内容,如果未能解决你的问题,请参考以下文章
Swift:来自 XIB 文件的多个自定义 TableViewCell
tableViewCell 的高度和宽度在快速滚动时发生变化