Проблема с SearchBar и контроллером панели поиска из-за износа SearchDisplayController - PullRequest
0 голосов
/ 16 ноября 2018

Мне нужна помощь с панелью поиска.Я застрял и не уверен, где взять его отсюда.Я пытаюсь обновить табличное представление, когда текстовое слово для поиска содержится в заголовке рецепта.Я не уверен, как это сделать из-за устаревшего контроллера searchDisplay.Помощь будет оценена.

import UIKit
import SwiftyJSON

class Downloader {

class func downloadImageWithURL(_ url:String) -> UIImage! {

    let data = try? Data(contentsOf: URL(string: url)!)
    return UIImage(data: data!)
}
}

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




@IBOutlet weak var recipeTable: UITableView!


// search functionality  Need help with my search functionality

   var filteredRecipes = [Recipe]()

func filterContentForSearch(searchText:String) {
    // need help here

    self.filteredRecipes = self.recipes.filter({(title:Recipe)  -> Bool in

        return (title.title!.lowercased().range(of: searchText.lowercased()) != nil)
    })
}

private func searchDisplayController(controller: UISearchController!, shouldReloadTableForSearchString searchString: String!) -> Bool {
    self.filterContentForSearch(searchText: searchString)
    return true
}





//end search parameters


// tableview functionionalitys
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if tableView == searchDisplayController!.searchResultsTableView {
        return filteredRecipes.count
    }else{
        return recipes.count
    }
   // recipeTable.reloadData()
}


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

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! RecipeTableViewCell


  if tableView == self.searchDisplayController!.searchResultsTableView{
    //get images from download
    DispatchQueue.main.async { () ->Void in
        cell.imageLabel.image = Downloader.downloadImageWithURL(self.filteredRecipes[indexPath.row].imageUrl)
    }
        cell.recipeLabel.text = self.filteredRecipes[indexPath.row].title
    recipeTable.reloadData()

   }else{
    //get image from download

    DispatchQueue.main.async { () ->Void in
        cell.imageLabel.image = Downloader.downloadImageWithURL(self.recipes[indexPath.row].imageUrl)

    }
    cell.recipeLabel.text = recipes[indexPath.row].title

    }
    //recipeTable.reloadData()
    return cell

}


// structs for json
struct Root : Decodable {
    let count : Int
    let recipes : [Recipe]
}

struct Recipe : Decodable { // It's highly recommended to declare Recipe in singular form
    let recipeId : String
    let imageUrl, sourceUrl, f2fUrl : String
    let title : String?
    let publisher : String
    let socialRank : Double
    let page : Int?
    let ingredients : [String]?
}

//recipes is array of Recipes
var recipes = [Recipe]() // array of recipes

//unfiltered recipes to put into search





fileprivate func getRecipes() {

    let jsonURL = "https://www.food2fork.com/api/search?key=264045e3ff7b84ee346eb20e1642d9d9"
    //.data(using: .utf8)!



    guard let url = URL(string: jsonURL) else{return}

    URLSession.shared.dataTask(with: url) {(data, response , err) in
        if let response = response as? HTTPURLResponse, response.statusCode != 200 {
            print(response.statusCode)
            return
        }
        DispatchQueue.main.async {

            if let err = err{
                print("failed to get data from URL",err)
                return
            }
            guard let data = data  else{return}

            //print(String(data: data, encoding: .utf8))
            do {
                let decoder = JSONDecoder()
                decoder.keyDecodingStrategy = .convertFromSnakeCase
                let result = try decoder.decode(Root.self, from: data)

                self.recipes = result.recipes

                //print(result.recipes)
                self.recipeTable.reloadData()
            }catch let jsonERR {
                print("Failed to decode",jsonERR)
            }
        }

        }.resume()

}



override func viewDidLoad() {

    super.viewDidLoad()
    //recipeTable.reloadData()

    //search bar

//filteredRecipes = recipes
    //call json object
    getRecipes()
}
}

1 Ответ

0 голосов
/ 16 ноября 2018

Вы можете использовать этот подход:

Добавить логическую переменную, чтобы указать, выполняет ли поиск

var searching: Bool = false

Используйте это для numberOfRowsInSection для таблицы

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! RecipeTableViewCell

    var recipe: Recipe

    if searching {
        recipe = filteredRecipes[indexPath.row]
    } else {
        recipe = recipes[indexPath.row]
    }

    DispatchQueue.main.async { () ->Void in
        cell.imageLabel.image = Downloader.downloadImageWithURL(recipe.imageUrl)
    }

    cell.recipeLabel.text = recipe.title

    return cell
}

И добавьте это для searchBar (установите поиск для других функций, таких как searchBarCancelButtonClicked)

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchBar.text == nil || searchBar.text == "" {
        searching = false
        filteredRecipes.removeAll()
        view.endEditing(true)
    } else {
        searching = true
        filteredRecipes = recipes.filter{$0.title.contains(searchBar.text!)}
    }

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