选择行后如何隐藏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。但这最后一个效果不佳。
有什么建议吗?
【问题讨论】:
我认为您需要搜索功能。为此使用UISearchBar
或UISearchController
,这将是您满足您要求的完美选择。在 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的主要内容,如果未能解决你的问题,请参考以下文章