我正在尝试在用户更改控制段时更改表数据。但是现在我的代码崩溃了。以下是我设置细分的方式:
let w = view.frame.width
let s = PinterestSegment(frame: CGRect(x: 20, y: 117, width: w - 40, height: 40), titles: ["Our faviorte", "Restuarnt", "Coffee", "Pharmacy", "Supermarketr", "Home", "Wemoent' Style", "Man's Style", "Beauty", "Travel"])
s.style.titleFont = UIFont.systemFont(ofSize: 14, weight: UIFont.Weight(rawValue: 5))
view.addSubview(s)
TableView数据从api保存并根据段选项进行过滤。
var info = Shops(shopname: shopName, Logo: logoString, family_id: familiy_id , design : designImage , rate : rate, time : time )
self.shops.append(info)
// filters all the segments this way
self.coffee = self.shops.filter { $0.shopname == "Starbucks" }
现在,在ViewdidLoad中更改细分:
s.valueChange = { index in
if index == 1 {
print(self.coffee)// it prints the data correctly
self.shops = self.coffee
}
if index == 2 {
self.shops = self.Restuarnt
}
if index == 3 {
self.shops = self.Pharmacy
}
self.tableView.reloadData()
}
我得到fatal error: Index out of range
DataSource和Delegate:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if searchActive {
return auxiliar!.count
}else{
return allShops.count
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
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 shop = allShops[indexPath.row]
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
}
}
答案 0 :(得分:1)
检查您的UITableView的委托和数据来源:numberOfRowsInSection
和cellForRowAtIndexPath
。您的数据源(self.Restuarnt
,self.Pharmacy
)中有tableView的单元格索引的数据。
答案 1 :(得分:1)
首先通过登录控制台找到崩溃点,它可能会从tableview数据源方法崩溃。确保self.Restuarnt和self.Pharmacy正在打印数据。还有一件事是,您使用了多个If语句!而是使用 if-else-if Ladder ,因为一旦匹配了索引,就没有意义检查其他索引! !
答案 2 :(得分:1)
这个方法应该是这样的,
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if searchActive {
return auxiliar!.count
}else{
return self.shops.count
}
}
因为每次在段更改时设置self.shops
您可以将选定的段索引保存在一个全局定义的变量中,并在cellForRow索引方法中访问该变量
我认为你可以评论这一行,因为你没有在cellForRow索引方法中使用任何地方
让shop = allShops [indexPath.row]
答案 3 :(得分:0)
你可能在行数上犯了错误。您需要在段更改时重新加载tableview。