由于SearchDisplayController的贬值,导致SearchBar和Search Bar控制器出现问题

时间:2018-11-15 22:12:11

标签: json swift

我想对搜索栏功能有所帮助。我被困住了,不确定从哪里拿走它。当配方标题中包含搜索文字时,我正在尝试更新tableview。由于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 :(得分:0)

您可以采用这种方法:

添加一个布尔变量以指示是否在搜索

var searching: Bool = false

将其用于tableview的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()
}