关闭 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的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableviewCell 中添加 uiview

关闭 TableViewCell 的 UIViewController

如何更改 tableViewCell 的颜色? [关闭]

自定义tableViewCell的侧滑删除按钮

关于tableviewcell的一些必备常识

当我在 ios 中点击视图时如何关闭 tableviewcell 中的操作表