根据细分选项重新加载tableview

时间:2017-12-11 08:51:37

标签: ios swift swift4

我正在尝试在用户更改控制段时更改表​​数据。但是现在我的代码崩溃了。以下是我设置细分的方式:

  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

        }
    }

4 个答案:

答案 0 :(得分:1)

检查您的UITableView的委托和数据来源:numberOfRowsInSectioncellForRowAtIndexPath。您的数据源(self.Restuarntself.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。