Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 致命错误:索引超出项目搜索范围_Ios_Swift_Uitableview_Uisearchbar_Swift4 - Fatal编程技术网

Ios 致命错误:索引超出项目搜索范围

Ios 致命错误:索引超出项目搜索范围,ios,swift,uitableview,uisearchbar,swift4,Ios,Swift,Uitableview,Uisearchbar,Swift4,我有控制段和UITableview。根据选定的段或执行的搜索,表格将重新加载。控制段工作正常,但搜索不工作。当我尝试在栏中键入任何内容时,它只会重新加载,当我单击单元格时,它会崩溃。有人能帮我吗?多谢各位 var auxiliar: [Shops]? = [Shops]() var searchActive: Bool = false // shops category var restuarnt = [Shops]() var coffee = [Shops](

我有控制段和UITableview。根据选定的段或执行的搜索,表格将重新加载。控制段工作正常,但搜索不工作。当我尝试在栏中键入任何内容时,它只会重新加载,当我单击单元格时,它会崩溃。有人能帮我吗?多谢各位

   var auxiliar: [Shops]? = [Shops]()
   var searchActive: Bool = false    
// shops category
   var restuarnt = [Shops]()
   var coffee = [Shops]()
   var pharmacy = [Shops]()
   var supermarket = [Shops]()
   var home = [Shops]()
   var clothes = [Shops]()
   var allShops  = [Shops]()    
   var shops = [Shops]()

   var selectedIndex = 0



s.valueChange = { index in

            if index == 0 {

                self.selectedIndex = 0
                self.tableView.reloadData()

            }
            if index == 1 {
                self.selectedIndex = 1

                self.tableView.reloadData()
            }

            if index == 2 {
                self.selectedIndex = 2

            }
            if index == 3 {

                self.selectedIndex = 3

            }



func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if selectedIndex == 0 {
            return  allShops.count

        }
        if selectedIndex == 1 {

            return self.coffee.count
        }
        if selectedIndex == 2 {

            return self.restuarnt.count
        }
        if selectedIndex == 3 {

            return self.pharmacy.count
        }

        if searchActive {
            return auxiliar!.count
        }else{
            return   allShops.count

        }

    }


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


    if selectedIndex == 0 {

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

        let entry = shops[indexPath.row]

        cell.shopImage.hnk_setImage(from: URL(string: entry.Logo))
        cell.shopName.text = entry.shopname
        cell.star.rating = Double(entry.rate)
        cell.time.text = entry.time


        cell.backgroundColor = UIColor(white: 1 , alpha : 0.5)
        return cell
    }

    if selectedIndex ==  1 {

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

        let entry = coffee[indexPath.row]

        cell.shopImage.hnk_setImage(from: URL(string: entry.Logo))
        cell.shopName.text = entry.shopname
        cell.star.rating = Double(entry.rate)
        cell.time.text = entry.time


        cell.backgroundColor = UIColor(white: 1 , alpha : 0.5)
        return cell
    }

    if selectedIndex ==  2 {

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

        let entry = restuarnt[indexPath.row]

        cell.shopImage.hnk_setImage(from: URL(string: entry.Logo))
        cell.shopName.text = entry.shopname
        cell.star.rating = Double(entry.rate)
        cell.time.text = entry.time


        cell.backgroundColor = UIColor(white: 1 , alpha : 0.5)
        return cell
    }
    if selectedIndex ==  3 {

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

        let entry = pharmacy[indexPath.row]

        cell.shopImage.hnk_setImage(from: URL(string: entry.Logo))
        cell.shopName.text = entry.shopname
        cell.star.rating = Double(entry.rate)
        cell.time.text = entry.time


        cell.backgroundColor = UIColor(white: 1 , alpha : 0.5)
        return cell
    }

    if searchActive

    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! ShopTableViewCell
        let entry1 = auxiliar?[indexPath.row]


        cell.shopImage.hnk_setImage(from: URL(string: (entry1?.Logo)!))
        cell.shopName.text = entry1?.shopname

        cell.backgroundColor = UIColor(white: 1 , alpha : 0.5)
        cell.time.text = entry1?.time

        cell.star.rating = Double((entry1?.rate)!)
        return cell
    }
    else {


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

        let entry = shops[indexPath.row]

        cell.shopImage.hnk_setImage(from: URL(string: entry.Logo))
        cell.shopName.text = entry.shopname
        cell.star.rating = Double(entry.rate)
        cell.time.text = entry.time


        cell.backgroundColor = UIColor(white: 1 , alpha : 0.5)
        return cell

    }
}



func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        if selectedIndex == 1 {
            let meal1 =  coffee[indexPath.row]


            guard (coffee.count) > indexPath.row else {
                print("Index out of range")
                return
            }

            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            var viewController = storyboard.instantiateViewController(withIdentifier: "viewControllerIdentifer") as! MealsDetailsController
            viewController.passedValue = (meal1.familiy_id)
            viewController.name = (meal1.shopname)

            print("\(meal1.familiy_id) im the search ")
            view.animateRandom()
            self.present(viewController, animated: true , completion: nil)



        }
        if selectedIndex == 0 {
            let meal1 =  shops[indexPath.row]


            guard (shops.count) > indexPath.row else {
                print("Index out of range")
                return
            }

            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            var viewController = storyboard.instantiateViewController(withIdentifier: "viewControllerIdentifer") as! MealsDetailsController
            viewController.passedValue = (meal1.familiy_id)
            viewController.name = (meal1.shopname)

            print("\(meal1.familiy_id) im the search ")
            view.animateRandom()
            self.present(viewController, animated: true , completion: nil)



        }
        if selectedIndex == 2 {
            let meal1 =  restuarnt[indexPath.row]


            guard (restuarnt.count) > indexPath.row else {
                print("Index out of range")
                return
            }

            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            var viewController = storyboard.instantiateViewController(withIdentifier: "viewControllerIdentifer") as! MealsDetailsController
            viewController.passedValue = (meal1.familiy_id)
            viewController.name = (meal1.shopname)

            print("\(meal1.familiy_id) im the search ")
            view.animateRandom()
            self.present(viewController, animated: true , completion: nil)



        }
        if selectedIndex == 3 {
            let meal1 =  pharmacy[indexPath.row]


            guard (pharmacy.count) > indexPath.row else {
                print("Index out of range")
                return
            }

            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            var viewController = storyboard.instantiateViewController(withIdentifier: "viewControllerIdentifer") as! MealsDetailsController
            viewController.passedValue = (meal1.familiy_id)
            viewController.name = (meal1.shopname)

            print("\(meal1.familiy_id) im the search ")
            view.animateRandom()
            self.present(viewController, animated: true , completion: nil)



        }

        if searchActive {
            let meal1 =  auxiliar?[indexPath.row]


            guard (auxiliar?.count)! > indexPath.row else {
                print("Index out of range")
                return
            }

            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            var viewController = storyboard.instantiateViewController(withIdentifier: "viewControllerIdentifer") as! MealsDetailsController
            viewController.passedValue = (meal1?.familiy_id)!
            viewController.name = (meal1?.shopname)!

            print("\(meal1?.familiy_id) im the search ")
          view.animateRandom()
            self.present(viewController, animated: true , completion: nil)




        } else {
            let meal =  shops[indexPath.row]


            guard shops.count > indexPath.row else {
                print("Index out of range")
                return
            }

            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            var viewController = storyboard.instantiateViewController(withIdentifier: "viewControllerIdentifer") as! MealsDetailsController
            viewController.passedValue = meal.familiy_id
            viewController.name = meal.shopname
            view.animateRandom()
            self.present(viewController, animated: true , completion: nil)


        }

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        auxiliar = shops.filter { $0.shopname.range(of: searchText, options: .caseInsensitive, range: nil, locale: nil) != nil}
        if searchText == "" || searchBar.text == nil {
            auxiliar = shops
        }
        tableView.reloadData()
    }

崩溃是由以下行引起的
let meal1=auxiliar?[indexath.row]

您应该交换以下两条语句:

let meal1 = auxiliar?[indexPath.row]
guard (auxiliar?.count)! > indexPath.row else {
    print("Index out of range")
    return
}

尝试订阅是没有意义的(如果
auxiliar.count哪一行代码抛出错误,这将导致异常?请提供一个.Unrelated,但不是没有
else
分支的单独
if
子句,而是应该使用
switch
语句使代码更具可读性。
let meal1=auxiliar?[indexPath.row]
谢谢你的回答!我确实修复了它,现在没有崩溃,但搜索结果不正确我在问题中添加了
textDidChange
请查看我是如何编码的
guard auxiliar.count > indexPath.row else {
    print("Index out of range")
    return
}
let meal1 = auxiliar[indexPath.row]