当我在自定义单元格类型中点击按钮时,我正在尝试移动到新的故事板,但是在自定义类中遇到问题。我目前有这个
class submitCell: UITableViewCell {
@IBAction func cancelButton(_ sender: Any) {
}
}
我需要cancelButton才能执行此操作
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "TripList") as! TripTableViewController
self.present(viewController, animated: true , completion: nil) //Move
除了.present不是UITableViewCell的方法,只有UIViewController。如何才能实现此功能?
答案 0 :(得分:3)
不要尝试在自定义单元格中调用该函数,而是在视图控制器中执行此操作。这就是你需要的东西
class submitCell: UITableViewCell {
var tapAction: ((UITableViewCell) -> Void)?
@IBAction func cancelButton(_ sender: Any) {
tapAction?(self)
}
}
然后在你的视图控制器中
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
cell.tapAction = { [weak self] cell in self?.move()}
}
func move() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "TripList") as! TripTableViewController
self.present(viewController, animated: true , completion: nil) //Move
}
注意:您应该将类名的第一个字母大写。查看Swift name conventions了解详情。
答案 1 :(得分:1)
首先在自定义单元格中,将按钮放入其中并连接。
class submitCell: UITableViewCell {
@IBOutlet weak var cancelButton: UIButton!
}
现在,让我们在您使用按钮的班级中执行您想要执行的操作。 在创建单元格的类中,执行
cell.delegate = self
cell.cancelButton.addTarget(self, action: #selector(cancelAction), for: .touchUpInside)
然后创建一个函数:
private func cancelAction(sender: UIButton){
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "TripList") as! TripTableViewController
self.present(viewController, animated: true , completion: nil) //Move
}
答案 2 :(得分:0)
有几种方法可以做到这一点。 - 创建一个委托 - 为您的按钮创建一个引用,以便在ViewController中使用。
我会链接一些案例,因此您可以为您的案例选择最佳方法:
答案 3 :(得分:0)
您可以通过引用自定义单元格类中的按钮将函数cancelButton委托给viewController。
基本上,首先需要在自定义单元格中为按钮设置一个插座:
@IBOutlet var button: UIButton!
然后在你的viewController中:
button.addTarget(self, action:#selector(cancelButton(_sender:)), for: .touchUpInside)
声明函数:
func cancelButton (_sender: UIButton) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "TripList") as! TripTableViewController
self.present(viewController, animated: true , completion: nil) //Move
}
PS:如果您有多个按钮,则可以将它们添加到同一个操作中,并通过标记控制行为。
button.tag = 0
if ( _sender.tag == 0.) {
// do tag 0
} else ...
答案 4 :(得分:0)
我会看一下delegate模式。
UITableViewCell
代表protocol SubmitCellDelegate: class {
func cancelButtonPressed()
}
UITableViewCell
子类class SubmitCell: UITableViewCell {
weak var delegate: SubmitCellDelegate?
@IBAction func cancelPressed(_ sender: UIButton) {
delegate?.cancelButtonPressed()
}
}
UIViewController
子类这必须在具有对tableview单元格的引用的类中实现。
class ViewController: UIViewController, SubmitCellDelegate {
// ...
// wherever you create your cell
submitCell.delegate = self
// ...
// Implement the SubmitCellDelegate function (Xcode will force you to)
func cancelButtonPressed() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "TripList") as! TripTableViewController
self.present(viewController, animated: true , completion: nil)
}
}
旁注:在大多数(所有?)面向对象的编程语言中,在类名上使用标题大小写是很好的做法(例如SubmitCell
而不是submitCell
)。