所以基本上我试图这样做:
我有一个TableView,我将自定义单元格(xib)加载到其中。此自定义单元格具有自己的相应自定义类。单元格加载得很好,但按钮不可点击(完全没有,因为你甚至看不到按钮被点击的任何类型的指示)。我做了一些谷歌搜索,试图在单元格中设置动作,尝试使用委托来处理动作。我迷路了。
以下是文件中的代码:
ViewController.swift
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// Use your cell's reuse identifier and cast the result
// to your custom table cell class.
let cell = tableView.dequeueReusableCellWithIdentifier("ReserveTableViewCell", forIndexPath: indexPath) as! ReserveTableViewCell
cell.delegate = self
let button = cell.locationButton.viewWithTag(1) as? UIButton
button?.addTarget(self, action: #selector(ReserveTableViewController.loc(_:)), forControlEvents: .TouchUpInside)
cell.pickupDate.text = "Today"
cell.returnDate.text = "Tomorrow"
//cell.locationButton.addTarget(self, action: #selector(loc), forControlEvents: .TouchUpInside)
return cell
}
func loc(sender: UIButton!) {
print("here")
}
CustomCell.swift
import UIKit
protocol ReserveTableViewCellDelegate {
func pickupLocationClick(cell: ReserveTableViewCell)
}
class ReserveTableViewCell : UITableViewCell {
@IBOutlet weak var searchButton: UIButton!
@IBOutlet weak var compactIcon: UIImageView!
@IBOutlet weak var midsizeIcon: UIImageView!
@IBOutlet weak var suvIcon: UIImageView!
@IBOutlet weak var luxuryIcon: UIImageView!
@IBOutlet weak var sportIcon: UIImageView!
@IBOutlet weak var pickupIcon: UIImageView!
@IBOutlet weak var pickupDate: UILabel!
@IBOutlet weak var returnDate: UILabel!
@IBOutlet weak var locationButton: UIButton!
var delegate: ReserveTableViewCellDelegate?
@IBAction func locationButtonAction(sender: AnyObject) {
delegate?.pickupLocationClick(self)
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
某些代码仍然来自其他尝试(这就是协议方法与viewcontroller.swift文件中现在定义的“loc”不匹配的原因。
在我的故事板中的TableView中,我选择关闭,当它打开时,你在单元格上选项卡使它看起来都很“昏暗”。
我在tableview中设置了自定义类,并且出口/操作在IB中链接。
任何?
答案 0 :(得分:1)
根据我的经验,可以在Cell文件和ViewController文件(将TableView作为成员保存)中为按钮添加功能
<强> ViewController.swift 强>
@IBAction func locationButtonAction(sender: AnyObject) {
// Do Some Action Here (Which interacts with data members of View
}
<强> CustomCell.swift 强>
@IBAction func locationButtonAction(sender: AnyObject) {
// Do Another Action (Which interacts with data members of the cell)
}
这两个功能都可以使用Storyboard Editor链接到Cell按钮的TouchUpInside!
祝你好运!
答案 1 :(得分:0)
在这里结合令人困惑的事情......
let button = cell.locationButton.viewWithTag(1) as? UIButton
这意味着,嘿locationButton,在你的子视图中查找viewWithTag为1.不是你想要的。只需使用
let button = cell.locationButton
然后,您需要确定您正在调用的操作以及它所在的类。如果您希望按钮在ViewController类中调用操作,则添加一个目标,如:
button.addTarget(self, action: #selector(ViewController.loc(_:)), forControlEvents: .TouchUpInside)
如果你想让按钮在ReserveTableViewController类中调用一个动作,这真的很奇怪,你需要一种方法来引用该类
button.addTarget(myReferenceToTheReserveTableViewControllerClass, action: #selector(ReserveTableViewController.loc(_:)), forControlEvents: .TouchUpInside)
您实际上可能正在寻找的是按钮调用单元格类中的方法,然后您可以根据需要进行响应或委托给另一个类,然后是:
button.addTarget(cell, action: #selector(ReserveTableViewCell.loc(_:)), forControlEvents: .TouchUpInside)
答案 2 :(得分:0)
我和你一样设置了项目。我在 ViewController.swift 中注意到的一件事是您编写了以下代码。
let button = cell.locationButton.viewWithTag(1) as? UIButton //If you will print or debug this button you will see nil
print("Button: \(button)") //prints "Button: nil"
button?.addTarget(self, action: #selector(ReserveTableViewController.loc(_:)), forControlEvents: .TouchUpInside)
以上代码不会为您的Button添加目标。它为你的Buttons子视图添加了标记值为1的目标。实际上是nil。请尝试以下代码。
cell.locationButton.addTarget(self, action: #selector(ReserveTableViewController.loc(_:)), forControlEvents: .TouchUpInside)(self, action: #selector(clicked), forControlEvents: .TouchUpInside)
在ViewController.swift中尝试以下代码
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// Use your cell's reuse identifier and cast the result
// to your custom table cell class.
let cell = tableView.dequeueReusableCellWithIdentifier("ReserveTableViewCell", forIndexPath: indexPath) as! ReserveTableViewCell
cell.delegate = self
//let button = cell.locationButton.viewWithTag(1) as? UIButton
//button?.addTarget(self, action: #selector(ReserveTableViewController.loc(_:)), forControlEvents: .TouchUpInside)
cell.locationButton.addTarget(self, action: #selector(loc), forControlEvents: .TouchUpInside)
cell.pickupDate.text = "Today"
cell.returnDate.text = "Tomorrow"
return cell
}
func loc(sender: UIButton!) {
print("here")
}