使用 swift3 为 xib 文件中的按钮提供操作
Posted
技术标签:
【中文标题】使用 swift3 为 xib 文件中的按钮提供操作【英文标题】:Provide action for button in the xib file using swift3 【发布时间】:2017-09-19 11:16:05 【问题描述】:提供:我的 xib 中有一个按钮 还附上了与此相关的 swift 文件。
问题:此单元格有一个按钮,需要在单击按钮时显示 ViewController。此单元格附加到另一个 ViewController 中的表视图。我想在“BOOK”按钮上实现一个动作,以便单击新的视图控制器应该打开。我无法做到这一点,任何人都可以建议我应该做些什么吗?
代码:
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
【问题讨论】:
在你的 UIviewcontroller 中调用这个bookbtn1
,
在您的 VC 中,在 cellforrowatindex 方法中在按钮上添加目标
你能出示一下代码cellforrowatindex
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int return 5; public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell let cell = tableView.dequeueReusableCell(withIdentifier: "cellid", for: indexPath) as! BookHotellCell 返回单元格 @Anbu.Karthik
【参考方案1】:
删除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
【讨论】:
这是一个意大利面条代码 :) 虽然,这个解决方案肯定会工作 @SabaZehra - 你击中的地方,你需要与此相关的帮助 我可以得到你的邮件ID吗? @Anbu.Karthik 但是如果我有两个按钮,这个代码就不起作用了。【参考方案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
【讨论】:
【参考方案3】:您可以在单元格类中创建一个委托协议,然后将委托设置为等于 viewcontroller,其中 tablview 单元格将显示。然后单击委托函数将被调用,您将获得视图控制器的操作,您可以在其中推送或弹出视图控制器或您想要的任何其他操作。
示例代码 - 单元类
protocol ButtonDelegate
func buttonClicked()
weak var delegate : ButtonDelegate?
@IBAction func bookbtn1(_ sender: Any)
delegate?.buttonClicked()
现在在 View Controller 中符合协议-“ButtonDelegate”,设置
cell.delegate = self
然后实现方法“buttonClicked()”
单击按钮时,您将在 buttonClicked() 中获取操作。
【讨论】:
Thankx 会尽力让您知道的。【参考方案4】:这里有两种可能的解决方案
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)
【讨论】:
添加删除观察者也在视图中消失 是的,需要在 viewWillDisappear 中删除观察者,或者您也可以在 deinit 中删除观察者以上是关于使用 swift3 为 xib 文件中的按钮提供操作的主要内容,如果未能解决你的问题,请参考以下文章
从 xib 文件中的操作按钮推送另一个 Viewcontroller
将数据从 TableViewController 传递到 XIB 文件而不使用 Segues-Swift 3