Ios 致命错误:索引超出项目搜索范围
我有控制段和UITableview。根据选定的段或执行的搜索,表格将重新加载。控制段工作正常,但搜索不工作。当我尝试在栏中键入任何内容时,它只会重新加载,当我单击单元格时,它会崩溃。有人能帮我吗?多谢各位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](
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]