提供:我的xib中有一个按钮 与此相关的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
}
}
答案 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()
}
}
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)
}