UIButton转移到Custom Cell中的故事板

时间:2017-07-21 14:14:12

标签: ios swift uitableview uibutton

当我在自定义单元格类型中点击按钮时,我正在尝试移动到新的故事板,但是在自定义类中遇到问题。我目前有这个

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。如何才能实现此功能?

5 个答案:

答案 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)。