簡體   English   中英

搜索和過濾數組Firebase數據swift3

[英]searching and filter array firebase data swift3

我的應用程序在搜索欄中搜索錯誤時出錯,該文本出現錯誤:thread1:signal SIGABRT可能是問題updateSearchResults()方法? 或數組類型? 我是個初學者,有什么想法嗎?

@IBOutlet weak var tableView: UITableView!

var data = [Any]()
var ref:FIRDatabaseReference!

// Filter Data from Firebase
var filteredData = [Any]()

// Declare searchBar

let searchController = UISearchController(searchResultsController: nil)


//is the device landscape or portrait
var isPortraid = true

@IBOutlet weak var bannerView: GADBannerView!



func fetchDataFromFirebase(){
    EZLoadingActivity.show("caricamento...", disableUI: true)
    ref = FIRDatabase.database().reference()
    ref.observe(.value, with: { (snapshot) in
        let dataDict = snapshot.value as! NSDictionary
        self.data = dataDict["data"] as! [Any]
        self.filteredData = self.data
        print ("Sacco di merda:\(self.filteredData)")
        self.tableView.reloadData()
        EZLoadingActivity.hide()
    })
}



override func viewDidLoad() {
    super.viewDidLoad()


    tableView.delegate = self
    fetchDataFromFirebase()

    //  Implement searchBar
    searchController.searchResultsUpdater = self
    searchController.dimsBackgroundDuringPresentation = false
    definesPresentationContext = true
    tableView.tableHeaderView = searchController.searchBar




    NotificationCenter.default.addObserver(self, selector: #selector(MainViewController.orientationChanged), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)


}


//TableView Data Source and Delegate


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


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return filteredData.count
}


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

    let cell = tableView.dequeueReusableCell(withIdentifier: "MainCell", for:indexPath) as! MainScreenTableViewCell
    let rowData = self.filteredData[indexPath.row] as! NSDictionary
    let imageName  = rowData["imageName"] as! String
    cell.backgroundImageView.image = UIImage(named: imageName)

    let label = rowData["categoryName"] as! String
    cell.mealCategoryLabel.text = label
    return cell
}



func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
    let categoryViewController = storyboard.instantiateViewController(withIdentifier: "CategoryViewController") as! CategoryViewController
    let rowData = self.data[indexPath.row] as! NSDictionary
    categoryViewController.categoryTitle = rowData["categoryName"] as! String
    let categoryData = rowData["category"] as! [Any]
    categoryViewController.data = categoryData
    self.navigationController?.pushViewController(categoryViewController, animated: true)

}





func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if isPortraid {
    return UIScreen.main.bounds.height/3
    } else {
        return UIScreen.main.bounds.height/1.2
    }
}

//更新搜索方法

func updateSearchResults(for searchController: UISearchController) {
    if searchController.searchBar.text! == ""{
        filteredData = data
    } else {
        filteredData = data.filter{($0 as AnyObject).contains(searchController.searchBar.text!)}

    }
    self.tableView.reloadData()
}
if searchController.searchBar.text! == ""

這幾乎可以肯定是罪犯。 UI對象的text屬性為空時,通常為nil,因此,當您強制展開它時,應用程序崩潰。 除非絕對確定在那時您永遠不會將其包裝成零,否則切勿強行打開包裝。

您可以通過幾種不同的方式來處理此問題,這基本上等於在執行任何操作之前確保text不為零。

就我個人而言,我將重寫if語句以解開非空情況下的可選內容:

if let text = searchController.searchBar.text, text != "" {
    filteredData = data.filter{($0 as AnyObject).contains(text)}
} else {
    filteredData = data
}

您還可以使用nil-coalescing

if (searchController.searchBar.text ?? "") == ""

但就我個人而言,我更喜歡編寫它來避免強制展開,即使您確定它不是nil,所以我推薦第一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM