Как найти несколько данных в табличном представлении с помощью Swift? - PullRequest
0 голосов
/ 28 марта 2019

Я создаю панель поиска, используя viewController, в viewController есть ячейка таблицы с двумя метками с названием: countryName и number. Я также добавил uisearchbar в viewController.

в этой задаче я могу искать только номера не для countryName,

как мне искать номера и названия стран?

вот мой код:

Модель

import Foundation
import UIKit

struct ModelData {
    var countryName: String
    var numbers: String
}

DataTableViewCell

class DataTableViewCell: UITableViewCell {
    @IBOutlet weak var numbers: UILabel!
    @IBOutlet weak var countryName: UILabel!
}

ViewController

import UIKit
import Alamofire
import SwiftyJSON

class ViewController: UIViewController{
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var countrySearch: UISearchBar!

    var searchedCountry = [ModelData]()
    var searching = false
    var dataJson = [modelData]()

    override func viewDidLoad() {
        super.viewDidLoad()

        countrySearch.delegate = self
        fetchData()
    }

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

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if searching{
            return searchedCountry.count
        } else{
            return dataJson.count
        }
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier:"DataTableViewCell", for: indexPath) as! DataTableViewCell
        if searching {
            cell?.numbers.text = searchedCountry[indexPath.row]
            cell?.countryName.text = searchedCountry[indexPath.row]
        } else {
            cell?.numbers.text = dataJson[indexPath.row]
            cell?.countryName.text = dataJson[indexPath.row]
        }
        return cell
    }
}

Позвоните JSON с URL:

func fetchData(){

    DispatchQueue.main.async {

        let url = ""

        Alamofire.request(url, method: .get, encoding: URLEncoding.default).responseJSON{
            (response) in
            switch response.result{
            case .success(let value):
                let json = JSON(value)
                if let data = json["data"].array{
                    for item in data{

                        self.tableView.reloadData()

                        let numbers = item["numbers"].stringValue
                        let countryName = item["countryName"].string

                        let data = ModelData(countryName: countryName, numbers: numbers)
                        self.dataJson.append(data)

                    }
                }

            case .failure(let error):
                print(error)
            }
        }
    }
}

Вот расширение viewController:

extension ViewController: UISearchBarDelegate{
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

        searchedCountry = dataJson.filter({$0.numbers.lowercased().prefix(searchText.count) == searchText.lowercased()})

        searchedCountry = dataJson.filter({$0.countryName.lowercased().prefix(searchText.count) == searchText.lowercased()})         
        searching = true
        self.tableView.reloadData()
    }
}

1 Ответ

0 голосов
/ 28 марта 2019

В вашей searchBar функции searchedCountry будет только поиск countryName:

//This filter will be replaced by the next filter 
searchedCountry = dataJson.filter({$0.numbers.lowercased().prefix(searchText.count) == searchText.lowercased()})

searchedCountry = dataJson.filter({$0.countryName.lowercased().prefix(searchText.count) == searchText.lowercased()}) 

searchedCountry устанавливается дважды, а фильтр numbers будет заменен на countryName

Вам придется искать несколько вариантов, например:

searchedCountry = dataJson.filter({$0.countryName.lowercased().prefix(searchText.count) == searchText.lowercased() || $0.numbers.lowercased().prefix(searchText.count) == searchText.lowercased()})
...