如何将文本字段用作 table 视图的 "search bar"
how to Use a textfield as a "search bar" for a table view
我有一个 table 视图嵌入到常规视图中(如图所示:Picture)
我有一个搜索栏和工作代码,这样当您开始搜索某个人的电子邮件时,table 视图会自动更新并只显示符合搜索条件的人。
有没有办法在第一个视图中使用文本字段作为搜索栏?
(如果您查看 Picture,那么显示“para”的标签就是用户要键入其联系人电子邮件的地方,我可以将该标签用作搜索栏吗,如果那么,怎么样?)
换句话说,我将如何使用“forField”作为搜索栏(forField 在代码的第二位)
这里是 tableView 的代码(当前有效):
class UsersTableViewController: UITableViewController, UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
//update the search results
filterContent(searchText: self.searchController.searchBar.text!)
}
@IBOutlet var usersTableView: UITableView!
let searchController = UISearchController(searchResultsController: nil)
var usersArray = [NSDictionary?]()
var filteredUsers = [NSDictionary?]()
var databaseRef: DatabaseReference!
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
definesPresentationContext = true
tableView.tableHeaderView = searchController.searchBar
databaseRef = Database.database().reference()
let usersRef = databaseRef.child("users")
let query = usersRef.queryOrdered(byChild: "email")
query.observe(.childAdded, with: {(snapshot) in
self.usersArray.append((snapshot.value as? NSDictionary?)!)
//insert the rows
self.usersTableView.insertRows(at: [IndexPath(row:self.usersArray.count-1, section: 0)], with: UITableView.RowAnimation.automatic)
}) { (error) in
print(error.localizedDescription)
}
print("HOLAAAAAAAAAAA")
print(self.usersArray)
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
if ((searchController.isActive) && (searchController.searchBar.text != "")){
return filteredUsers.count
}
return self.usersArray.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let user: NSDictionary
if ((searchController.isActive) && (searchController.searchBar.text != "")){
user = filteredUsers[indexPath.row]!
}else{
user = self.usersArray[indexPath.row]!
}
cell.textLabel?.text = user["email"] as? String
cell.detailTextLabel?.text = user["name"] as? String
return cell
}
func filterContent(searchText: String){
self.filteredUsers = self.usersArray.filter({ user in
let userEmail = user!["email"] as? String
return(userEmail?.lowercased().contains(searchText.lowercased()))!
})
tableView.reloadData()
}
}
对于视图控制器,它实际上只是文本字段和标签。:
class PayViewController: UIViewController, STPAddCardViewControllerDelegate {
@IBOutlet weak var forField: UITextField!
@IBOutlet weak var toField: UITextField!
@IBOutlet weak var amountLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
}
换句话说,我将如何使用“forField”作为搜索栏
在最近的评论和更新之后,我将以下内容添加到 payViewController:
override func viewDidLoad() {
super.viewDidLoad()
//var myTable:UsersTableViewController?
myTable = self.children[0] as! UsersTableViewController
self.toField.addTarget(self, action: #selector(UsersTableViewController.textChanges(_:)), for: UIControl.Event.editingChanged)
}
并在 table 视图控制器中更改了以下功能:
func updateSearchResults(for searchController: UISearchController) {
//update the search results
filterContent(searchText: searchT)
}
@objc func textChanges(_ textField: UITextField) {
let text = textField.text! // your desired text here
// Now do whatever you want.
searchT = text
}
您的问题是从父级访问子级,因此您需要在 PayViewController
中声明
var myTable:UsersTableViewController?
在 viewDidLoad 里面
myTable = self.children[0] as! UsersTableViewController
之后在文本字段的更改操作中执行
myTable.filterContent(searchText:forField.text!)
顺便说一句,您还可以将搜索栏相关内容转移到 searchController
中,或者删除该子序列并在字段正下方添加一个 table 并将所有内容放入 PayViewController
You don't have to use UITableViewController
for utilizing table an instance of UITableView
is sufficient and can be directly as a subview inside the vc
我有一个 table 视图嵌入到常规视图中(如图所示:Picture)
我有一个搜索栏和工作代码,这样当您开始搜索某个人的电子邮件时,table 视图会自动更新并只显示符合搜索条件的人。
有没有办法在第一个视图中使用文本字段作为搜索栏?
(如果您查看 Picture,那么显示“para”的标签就是用户要键入其联系人电子邮件的地方,我可以将该标签用作搜索栏吗,如果那么,怎么样?)
换句话说,我将如何使用“forField”作为搜索栏(forField 在代码的第二位)
这里是 tableView 的代码(当前有效):
class UsersTableViewController: UITableViewController, UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
//update the search results
filterContent(searchText: self.searchController.searchBar.text!)
}
@IBOutlet var usersTableView: UITableView!
let searchController = UISearchController(searchResultsController: nil)
var usersArray = [NSDictionary?]()
var filteredUsers = [NSDictionary?]()
var databaseRef: DatabaseReference!
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
definesPresentationContext = true
tableView.tableHeaderView = searchController.searchBar
databaseRef = Database.database().reference()
let usersRef = databaseRef.child("users")
let query = usersRef.queryOrdered(byChild: "email")
query.observe(.childAdded, with: {(snapshot) in
self.usersArray.append((snapshot.value as? NSDictionary?)!)
//insert the rows
self.usersTableView.insertRows(at: [IndexPath(row:self.usersArray.count-1, section: 0)], with: UITableView.RowAnimation.automatic)
}) { (error) in
print(error.localizedDescription)
}
print("HOLAAAAAAAAAAA")
print(self.usersArray)
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
if ((searchController.isActive) && (searchController.searchBar.text != "")){
return filteredUsers.count
}
return self.usersArray.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let user: NSDictionary
if ((searchController.isActive) && (searchController.searchBar.text != "")){
user = filteredUsers[indexPath.row]!
}else{
user = self.usersArray[indexPath.row]!
}
cell.textLabel?.text = user["email"] as? String
cell.detailTextLabel?.text = user["name"] as? String
return cell
}
func filterContent(searchText: String){
self.filteredUsers = self.usersArray.filter({ user in
let userEmail = user!["email"] as? String
return(userEmail?.lowercased().contains(searchText.lowercased()))!
})
tableView.reloadData()
}
}
对于视图控制器,它实际上只是文本字段和标签。:
class PayViewController: UIViewController, STPAddCardViewControllerDelegate {
@IBOutlet weak var forField: UITextField!
@IBOutlet weak var toField: UITextField!
@IBOutlet weak var amountLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
}
换句话说,我将如何使用“forField”作为搜索栏
在最近的评论和更新之后,我将以下内容添加到 payViewController:
override func viewDidLoad() {
super.viewDidLoad()
//var myTable:UsersTableViewController?
myTable = self.children[0] as! UsersTableViewController
self.toField.addTarget(self, action: #selector(UsersTableViewController.textChanges(_:)), for: UIControl.Event.editingChanged)
}
并在 table 视图控制器中更改了以下功能:
func updateSearchResults(for searchController: UISearchController) {
//update the search results
filterContent(searchText: searchT)
}
@objc func textChanges(_ textField: UITextField) {
let text = textField.text! // your desired text here
// Now do whatever you want.
searchT = text
}
您的问题是从父级访问子级,因此您需要在 PayViewController
var myTable:UsersTableViewController?
在 viewDidLoad 里面
myTable = self.children[0] as! UsersTableViewController
之后在文本字段的更改操作中执行
myTable.filterContent(searchText:forField.text!)
顺便说一句,您还可以将搜索栏相关内容转移到 searchController
中,或者删除该子序列并在字段正下方添加一个 table 并将所有内容放入 PayViewController
You don't have to use
UITableViewController
for utilizing table an instance ofUITableView
is sufficient and can be directly as a subview inside the vc