使用swift3为xib文件中的按钮提供操作

时间:2017-09-19 11:16:05

标签: ios swift3 xib

提供:我的xib中有一个按钮enter image description here 与此相关的swift文件也已附加。

ISSUE:此单元格有一个按钮,需要在按钮单击时显示ViewController。此单元格附加到另一个ViewController中的表视图。我想在按钮“BOOK”上实现一个动作,以便在单击新视图控制器时应该打开。我无法做到这一点可以任何人建议我应该做的事情吗?

CODE:

import UIKit

class HotelBookingCell: UITableViewCell {

    @IBOutlet weak var BookbtnOutlet: UIButton!
    override func awakeFromNib() {
        super.awakeFromNib()
        BookbtnOutlet.layer.cornerRadius = 7
        // Initialization code
    }

    @IBAction func bookbtn1(_ sender: Any) {

    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

4 个答案:

答案 0 :(得分:5)

删除tableviewcell类中的以下代码

/*
@IBAction func bookbtn1(_ sender: Any) {

} */

并添加到您的UIviewcontroller cellForRowAtIndexPath

cell. BookbtnOutlet.tag = indexpath.row
cell. BookbtnOutlet.addTarget(self, action: #selector(self. bookbtn1(_:)), for: .touchUpInside);

同一个UIVeiwController中的任何地方都定义了如下函数

func bookbtn1(_ sender : UIButton){
// call your segue code here
}

答案 1 :(得分:2)

为此创建协议的可能解决方案之一:

protocol HotelBookingCellDelegate: class {
     // you can add parameters if you want to pass. something to controller
     func bookingCellBookButtonTouched()  
}

然后是你的细胞类

class HotelBookingCell: UITableViewCell {
     // add a propery
     public weak var delegate: HotelBookingCellDelegate?

     @IBAction func bookbtn1(_ sender: Any) {
          delegate?.bookingCellBookButtonTouched()
     }
}
在你的cellForRowAtIndexPath

cell.delegate = self

之后,在您签署此协议的控制器中,实现它

extension YourViewController: HotelBookingCellDelegate {
    func bookingCellBookButtonTouched() {
      // Do whatever you want
    }
}

答案 2 :(得分:1)

您可以在单元类中创建委托协议,然后将委托设置为等于tablview单元格将显示的viewcontroller。然后单击将调用委托函数,您将获得视图控制器的操作,您可以在其中推送或弹出视图控制器或任何其他所需的操作。

示例代码 - Cell Class

protocol ButtonDelegate {
    func buttonClicked()
}

weak var delegate : ButtonDelegate?
@IBAction func bookbtn1(_ sender: Any) {
    delegate?.buttonClicked()
}

现在在View Controller中符合协议 - " ButtonDelegate",设置

cell.delegate = self

然后实现方法" buttonClicked()"

单击按钮时,您将在buttonClicked()中获取操作。

答案 3 :(得分:1)

这里有两种可能的解决方案

1)您可以在 cellForRowAtIndexPath 中添加此按钮的目标,如下面的代码

cell.bookbtn1.tag = indexPath.row      cell.bookbtn1.addTarget(self,action:#selector(self.bookbtn1(sender :)),for:.touchUpInside)

2)您的主视图控制器中的另一个解决方案是您可以在 viewDidLoad 中添加通知中心观察者

NotificationCenter.default.addObserver(self, selector: #selector(self.bookbtn1ClickedFromCell), name: NSNotification.Name(rawValue: BUTTON_CLICK), object: nil)

并实现方法并从此方法导航到另一个视图控制器

func bookbtn1ClickedFromCell()
{
    //navigate to another vc
}

并在UITableViewCell文件中实现的操作方法发布此通知

@IBAction func bookbtn1(_ sender: Any) {

  NotificationCenter.default.post(name: Notification.Name(rawValue: BUTTON_CLICK), object: self)
}

所以它会在你的主视图控制器中调用bookbtn1ClickedFromCell,你可以导航到另一个视图控制器

你应该删除 viewWillDisappear deinit 方法中的观察者

 deinit {
    NotificationCenter.default.removeObserver(self)
}

  override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    NotificationCenter.default.removeObserver(self)

}