关闭 TableViewCell 的 UIViewController
Posted
技术标签:
【中文标题】关闭 TableViewCell 的 UIViewController【英文标题】:Dismiss UIViewController for TableViewCell 【发布时间】:2019-05-17 20:01:52 【问题描述】:我在 UIViewController 中有一个 tableview。这个表视图有一个带有按钮的动态表。
我为 TableViewCell 中的每个按钮设置了这样的功能:
class ButtonTableViewCell: UITableViewCell
let defaults = UserDefaults.standard
var targetTitle: String!
@IBOutlet weak var buttonDisplay: UIButton!
func setButton(title: String)
buttonDisplay.setTitle(title.uppercased(), for: .normal)
targetTitle = title
buttonDisplay.addTarget(self, action: #selector(changeValue(_:)), for: .touchUpInside)
@objc func changeValue(_ sender: Any)
currentCar = targetTitle
defaults.set(currentCar, forKey: "currentCar")
如何关闭包含函数 @objc func changeValue(_ sender: Any)
中的 TableView 的 UIViewController?
此外,由于按钮是动态添加的,因此我还需要 tableview 本身的动态高度 - 如何使用每个添加的单元格调整 tableview?
UIViewController:
class DropdownViewController: UIViewController
@IBOutlet weak var tableViewButtons: UITableView!
override func viewDidLoad()
super.viewDidLoad()
tableViewButtons.delegate = self
tableViewButtons.dataSource = self
extension DropdownViewController: UITableViewDataSource, UITableViewDelegate
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return carsArray.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let rowData = carsArray[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "buttonCell") as! ButtonTableViewCell
cell.setButton(title: rowData.name)
return cell
【问题讨论】:
【参考方案1】:您可以使用委托:
protocol ButtonTableViewCellDelegate
func dismissFromCell()
class ButtonTableViewCell: UITableViewCell
let defaults = UserDefaults.standard
var targetTitle: String!
// Delegate should be weak to avoid memory leaks
weak var delegate: ButtonTableViewCellDelegate?
@IBOutlet weak var buttonDisplay: UIButton!
func setButton(title: String)
buttonDisplay.setTitle(title.uppercased(), for: .normal)
targetTitle = title
buttonDisplay.addTarget(self, action: #selector(changeValue(_:)), for: .touchUpInside)
@objc func changeValue(_ sender: Any)
currentCar = targetTitle
defaults.set(currentCar, forKey: "currentCar")
delegate?.dismissFromCell()
class DropdownViewController: UIViewController
@IBOutlet weak var tableViewButtons: UITableView!
override func viewDidLoad()
super.viewDidLoad()
tableViewButtons.delegate = self
tableViewButtons.dataSource = self
extension DropdownViewController: UITableViewDataSource, UITableViewDelegate
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return carsArray.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let rowData = carsArray[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "buttonCell") as! ButtonTableViewCell
cell.setButton(title: rowData.name)
// Setting Delegate here
cell.delegate = self
return cell
// Extend your controller to conform your Delegate Protocol
extension DropdownViewController: ButtonTableViewCellDelegate
func dismissFromCell()
self.dismiss()
您可以在此处获取有关委托模式的更多信息:https://www.appcoda.com/swift-delegate/
【讨论】:
【参考方案2】:您需要使用委托来执行操作。只需使用函数创建一个协议,然后在您的 changeValue
函数中调用委托。
否则,使用这个:
var responder: UIResponder! = self
repeat responder = responder.next while !(responder is UIViewController)
(responder as! UIViewController).dismiss()
它只是沿着响应者链向上直到找到 UIViewController,然后执行所需的任何操作。仅当您在某处将 UIViewController 作为父级时才使用它,否则它将不起作用。
【讨论】:
我同意,但知道另一种方式并没有真正有害。以上是关于关闭 TableViewCell 的 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章