Как использовать текстовое поле в качестве «панели поиска» для представления таблицы - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть табличное представление, встроенное в обычный вид (как показано на этом рисунке: Изображение )

У меня есть панель поиска и рабочий код, так что когда вы начинаете искатьэлектронная почта человека, представление таблицы автоматически обновляется и просто отображает людей, которые соответствуют критериям поиска.

Есть ли способ использовать textField в первом представлении в качестве панели поиска?

(если вы посмотрите на Picture , то на ярлыке с надписью «para» пользователь будет набирать адрес электронной почты своего контакта, могу ли я использовать этот ярлык в качестве поискаbar, если да, то как?)

другими словами, как бы я использовал «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 ammountLabel: 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)
}

и изменил следующие функции в контроллере табличного представления:

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
    }

1 Ответ

0 голосов
/ 08 февраля 2019

Ваша проблема заключается в доступе к дочернему элементу от родителя, поэтому вам нужно объявить это внутри PayViewController

var myTable:UsersTableViewController?

и внутри viewDidLoad

myTable = self.children[0] as! UsersTableViewController

после этого в действии chnage объектаtextfeilds делают

myTable.filterContent(searchText:forField.text!)

Кстати, вы также можете перенести содержимое панели поиска внутри searchController или удалить этот дочерний переход, добавить таблицу прямо под полями и сделать все внутри PayViewController

Вам не нужно использовать UITableViewController для использования таблицы, достаточно экземпляра UITableView, который может быть непосредственно подпредставлением внутри vc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...