Как реализовать UISearchBar для фильтрации имени или заглавной буквы JSON, используя JSON Декодер в приложении swift iOS - PullRequest
0 голосов
/ 13 марта 2020

Как реализовать UISearchBar для фильтрации имени или заглавной буквы JSON, используя JSON Декодер в быстром iOS приложении. Я хочу реализовать UISearchBar и результаты поиска или фильтровать результаты, используя имя из JSON Data.

  import UIKit

Структура создана

  struct jsonstruct:Decodable
  {
  let name:String   
   let capital:String
  }

  class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate, UISearchBarDelegate, UISearchControllerDelegate, UISearchDisplayDelegate {

Создание выхода для TableView и SearchBar

   @IBOutlet var tableview: UITableView!

   @IBOutlet var searchBar: UISearchBar!

Объявление JSON

   var arrdata = [jsonstruct]()

Функция для получения данных

func getdata()
{
let url = URL(string: "https://restcountries.eu/rest/v2/all")

URLSession.shared.dataTask(with: url!)
{
(data, response, error) in

do
{
if error == nil
{
self.arrdata = try
JSONDecoder().decode([jsonstruct].self, from: data!)

for mainarr in self.arrdata
{
print(mainarr.name,":",mainarr.capital as Any)
DispatchQueue.main.async 
{
self.tableview.reloadData()
}
}
}
}
catch
{
print(error.localizedDescription)
}
}.resume()
}

ПРОСМОТР ТАБЛИЦЫ

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{
return self.arrdata.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell:TableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell") as! TableViewCell
cell.label1.text = "Name: \(arrdata[indexPath.row].name)"
cell.label2.text = "Capital: \(arrdata[indexPath.row].capital)"
return cell
}

Функция переопределения

override func viewDidLoad() 
{
getdata()
}

Ответы [ 3 ]

0 голосов
/ 13 марта 2020

Вам нужно сделать два объекта данных, один исходный данные и другие отфильтрованные данные.

var filteredArrData = [jsonstruct]()
var arrdata = [jsonstruct]()

Чем в ваших функциях getData:

do {
 self.arrdata = try JSONDecoder().decode([jsonstruct].self, from: data!)
 self.filteredArrData = self.arrdata
}

Затем в вашем табличном представлении делегировать и источник данных:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{
   return self.filteredArrData.count
}

fun c tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell:TableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell") as! TableViewCell
   cell.label1.text = "Name: \(filteredArrData[indexPath.row].name)"
   cell.label2.text = "Capital: \(filteredArrData[indexPath.row].capital)"
   return cell
}

Чем функция фильтра работает следующим образом:

func applyFilters(textSearched: String) {
            filteredArrData = arrdata.filter({ item -> Bool in
            return item.name.lowercased().hasPrefix(textSearched.lowercased())
        })
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }

Затем передайте вашу строку этой функции, и все будет работать нормально.

0 голосов
/ 13 марта 2020

Предполагается, что вы не кэшируете все свои данные, и фильтрация выполняется в реальном времени через API. Вам нужно будет установить объект или viewcontroller в качестве делегата панели поиска (UISearchBarDelegate). Затем используйте searchText в качестве текста для вашего запроса API.

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    //call throttle that will call urlsession
}

Поскольку мы вводим один символ за раз, мы не вызываем API каждый раз. Возможно, вам придется использовать регулятор, чтобы выполнять меньше вызовов API, вместо того, чтобы посылать символ за поиском символа. Этот учебник о регулировании может оказаться полезным: Простое регулирование в Swift .

Большинство API-интерфейсов REST должны иметь функцию фильтрации, и вы можете легко добавить введенное имя или заглавную букву.

https://restcountries.eu/rest/v2/name/append name here
https://restcountries.eu/rest/v2/capital/append capital here

Это пример сетевого кода для получения результатов. Используйте результаты для безопасного вызова другого метода в главной очереди для перезагрузки просмотра таблицы.

if let url = URL(string: "https://restcountries.eu/rest/v2/country?q=name") {
   URLSession.shared.dataTask(with: url) { data, response, error in
      if let data = data {
          do {
             let results = try JSONDecoder().decode(YourCustomDecodeStruct.self, from: data)
             //safely your data source and reload the tableview
          } catch let error {
             print(error)
          }
       }
   }.resume()
}
0 голосов
/ 13 марта 2020

Создайте TextField с IBAction из didbegin, как показано ниже, и создайте массив, в котором вы можете фильтровать данные.

@IBAction func tfSearch(_ sender: UITextField) {
    let filteredArray = yourArr.filter { $0.contains(sender.text) }
}

enter image description here

...