选择行后如何隐藏tableView

Posted

技术标签:

【中文标题】选择行后如何隐藏tableView【英文标题】:How to hide a tableView after selecting a row 【发布时间】:2019-02-28 10:35:33 【问题描述】:

我有一个 textField,当触摸它时会显示一个带有一些行的 tableView。

我正在尝试这样做:当用户选择其中一行时,row 的值被放置在 textField 中并且 tableView 被关闭。

第一部分对我来说效果很好。用户触摸一行,textField 显示该行的值。但是如果我想关闭 tableview,我必须在行上按两次。

这是我的代码:

class Redactar_mensaje: UIViewController, UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate 


    var values = ["123 Main Street", "789 King Street", "456 Queen Street", "99 Apple Street", "red", "orange", "yellow", "green", "blue", "purple", "owaldo", "ostras", "Apple", "Pineapple", "Orange", "Adidas"]

@IBOutlet weak var campo_para: UITextField!
@IBOutlet weak var tableView: UITableView!

    var originalCountriesList:[String] = Array()

override func viewDidLoad() 
        super.viewDidLoad()

        tableView.isHidden = true


        for country in values 
           originalCountriesList.append(country)
        

        campo_para.delegate = self
        tableView.delegate = self
        tableView.dataSource = self

        campo_para.addTarget(self, action: #selector(textFieldActive), for: UIControlEvents.touchDown)
        campo_para.addTarget(self, action: #selector(searchRecords(_ :)), for: .editingChanged)
    


    @objc func searchRecords(_ textField: UITextField) 
        self.values.removeAll()
        if textField.text?.count != 0 
            for country in originalCountriesList 
                if let countryToSearch = textField.text
                    let range = country.lowercased().range(of: countryToSearch, options: .caseInsensitive, range: nil, locale: nil)
                    if range != nil 
                        self.values.append(country)
                    
                
            
         else 
            for country in originalCountriesList 
                values.append(country)
            
        

        tableView.reloadData()
    



    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return values.count
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        var cell = tableView.dequeueReusableCell(withIdentifier: "cellx")
        if cell == nil 
            cell = UITableViewCell(style: .default, reuseIdentifier: "cellx")
        
        cell?.textLabel?.text = values[indexPath.row]
        return cell!
    

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        tableView.deselectRow(at: indexPath, animated: true)

        campo_para.text = values[indexPath.row]

        tableView.isHidden = true //I need press twice for this. I want press only one

    


    func textFieldActive() 
        tableView.isHidden = false
    


理想情况下,用户触摸 textField,显示 tableView,选择其中一个值,然后自动关闭 tableView。但这最后一个效果不佳。

有什么建议吗?

【问题讨论】:

我认为您需要搜索功能。为此使用UISearchBarUISearchController,这将是您满足您要求的完美选择。在 searchbar 的委托方法中 - 在 searchBarBeginEditing 上 - 您可以显示 tableview 并单击 tableview 单元格,您可以隐藏 tableview。 【参考方案1】:

详情

xCode 8.3,斯威夫特 3.1

在 TableViewCell 上检测双击和单击的示例

ViewController.swift

import UIKit

class ViewController: UIViewController 

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() 
        super.viewDidLoad()
        tableView.dataSource = self
        tableView.tableFooterView = UIView()
    


extension ViewController: UITableViewDataSource 

    func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 10
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell") as! TableViewCell
        cell.label.text = "\(indexPath)"
        cell.delegate = self
        return cell
    


extension ViewController:TableViewCellDelegate 


    func tableViewCell(singleTapActionDelegatedFrom cell: TableViewCell) 
        let indexPath = tableView.indexPath(for: cell)
        print("singleTap \(String(describing: indexPath)) ")
    

    func tableViewCell(doubleTapActionDelegatedFrom cell: TableViewCell) 
        let indexPath = tableView.indexPath(for: cell)
        print("doubleTap \(String(describing: indexPath)) ")
        //You can hide your textfield here
    

TableViewCell.swift

import UIKit

class TableViewCell: UITableViewCell 

    @IBOutlet weak var label: UILabel!
    private var tapCounter = 0
    var delegate: TableViewCellDelegate?


    override func awakeFromNib() 
        super.awakeFromNib()

        let tap = UITapGestureRecognizer(target: self, action: #selector(tapAction))
        addGestureRecognizer(tap)
    

    func tapAction() 

        if tapCounter == 0 
            DispatchQueue.global(qos: .background).async 
                usleep(250000)
                if self.tapCounter > 1 
                    self.doubleTapAction()
                 else 
                    self.singleTapAction()
                
                self.tapCounter = 0
            
        
        tapCounter += 1
    

    func singleTapAction() 
        delegate?.tableViewCell(singleTapActionDelegatedFrom: self)
    

    func doubleTapAction() 
        delegate?.tableViewCell(doubleTapActionDelegatedFrom: self)
    

TableViewCellDelegate.swift

import UIKit

protocol TableViewCellDelegate 
    func tableViewCell(singleTapActionDelegatedFrom cell: TableViewCell)
    func tableViewCell(doubleTapActionDelegatedFrom cell: TableViewCell)

结果

【讨论】:

谢谢。我以更简单的方式解决了它。也只是行的顺序并添加一行。首先它使其不可见,然后将结果放入 textField 中,由于某种原因,它起作用了!【参考方案2】:

在这里我提出我的解决方案,以防其他人会发生类似的事情。

只需更改行的顺序并再添加一行。首先它使其不可见,然后将结果放入 textField 中,神奇的是,它起作用了!

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 

        tableView.isHidden = true
        campo_para.text = NombreUsuario[indexPath.row]
        campo_asunto.becomeFirstResponder()

    

谢谢!

【讨论】:

以上是关于选择行后如何隐藏tableView的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableView 中,如何在隐藏行后关闭行的底部边框?

隐藏或删除行后如何更新 HTML 表中的行索引?

jquery给表格动态添加删除行后如何获取数据

微信小程序文字超过行后隐藏并且显示省略号

gridview 选中某行后 某行的按钮显示,无选中则隐藏

选择行后Tableview不会重新加载数据