您可以使用delegation pattern。假设您已经实现了一个自定义表格单元格,您可以在其类中定义一个属性来保存您认为有助于识别行的任何内容 - 它可以是它的索引,或者(我的首选方式)一个代表该行的类的实例单元格中显示的数据(我称之为MyCellData。
这个想法是让单元格通知表格视图控制器点击该按钮,传递有关(显示的数据)行的相关数据。然后表格视图控制器启动一个 segue,并在重写的 prepareForSegue 方法中将单元格传递的数据存储到目标控制器。这样,如果您必须显示有关该行的详细信息数据,您将拥有所有相关信息,例如详细信息数据本身,或者目标视图控制器可以用来从本地数据库或远程服务中检索数据的标识符.
定义协议:
protocol MyCellDelegate {
func didTapMilk(data: MyCellData)
}
然后在cell类中声明一个名为delegate的属性,并从IBAction调用它的didTapMilk方法
class MyTableCell : UITableViewCell {
var delegate: MyCellDelegate?
var data: MyCellData!
@IBAction func didTapMilk() {
if let delegate = self.delegate {
delegate.didTapMilk(self.data)
}
}
}
接下来,在您的表格视图控制器中实现协议,并覆盖 prepareForSegue
extension MyTableViewController : MyCellDelegate {
func didTapMilk(data: MyCellData) {
performSegueWithIdentifier("mySegueId", sender: data)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if segue.identifier == "mySegueId" {
let vc: MyDestinationViewController = segue.destinationViewController as MyDestinationViewController
vc.data = sender as? MyCellData
}
}
}
当然,您需要在目标视图控制器上使用 data 属性才能使其正常工作。如上所述,如果它的作用是显示有关行的详细信息,您可以将所有必需的数据嵌入到您的 MyCellData 类中 - 或者至少您需要从任何源(例如本地数据库、远程服务等)。
最后,在 cellForRowAtIndexPath 中,将数据存储在单元格中并将其delegate 属性设置为self:
extension MyTableViewController : UITableViewDataSource {
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let data: MyCellData = retrieveDataForCell(indexPath.row) // Retrieve the data to pass to the cell
let cell = self.tableView.dequeueReusableCellWithIdentifier("myCellIdentifier") as MyTableCell
cell.data = data
cell.delegate = self
// ... other initializations
return cell
}
}