【问题标题】:Tableview category refinement表视图类别细化
【发布时间】:2018-03-15 22:41:46
【问题描述】:

我在 firebase 中有大量数据显示在 tableview 上。数据来自附近不同的企业,我想添加一个功能来按业务类型(食品、旅游、购物等)过滤/排序数据。我添加了一个带有分段控件的选项卡栏,用作过滤/排序功能。当用户选择购物时,我只希望显示购物业务并删除所有其他业务。我尝试了几种不同的方法来做到这一点,但都没有成功。当应用程序首次加载时,我能够正确填充表格视图单元格,但在选择过滤器/排序选项时我无法正确加载单元格。这是我当前的代码。

@IBOutlet weak var selects: UISegmentedControl!
@IBAction func selections(_ sender: Any) {
    if selects.selectedSegmentIndex == 0 {
        //all
        print("all")
        cate = 0
        loadposts()
    }
    else if selects.selectedSegmentIndex == 1 {
        //shopping
        print("shopping")
        cate = 1
        loadposts()
    }
    else if selects.selectedSegmentIndex == 2 {
        //food
        print("food")
        cate = 2
        loadposts()
    }
    else if selects.selectedSegmentIndex == 3 {
        //travel
        print("travel")
        cate = 3
        loadposts()
    }
    else if selects.selectedSegmentIndex == 4 {
        //events
        print("event")
        cate = 4
        loadposts()
    }
    else {
        //more
        print("more")
        cate = 5
        loadposts()
    }
}

func loadposts() {
    ref = Database.database().reference()
    let trace = Performance.startTrace(name: "test trace")
    trace?.incrementCounter(named:"retry")
    let userID = Auth.auth().currentUser?.uid
    print(userID!)


   ref.child("Users").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in
        // Get user value
        let value = snapshot.value as? NSDictionary
        let one1 = value?["Coupon Book"] as? String ?? ""
        let two2 = value?["charitylogo"] as? String ?? ""
        print("one1: \(one1)")
        bogus.set(one1, forKey: "bogus")
    let url = URL(string: two2)
    print("Url: \(url!)")
    URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in
        if error != nil{
            print(error)
            return
        }
        DispatchQueue.main.async {
           /// self.centernavlogo = UIButton(type: .custom)
            let pim = UIImage(data: data!)
            self.vood.background = pim
            ///self.centernavlogo.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
           /// self.centernavlogo.imageView?.contentMode = .scaleAspectFit
           /// self.centernavlogo.setImage(pim, for: .normal)
          ///  self.centernavlogo.setBackgroundImage(pim, for: .normal)

            /// self.centernavlogo.tintColor = UIColor.white

            ///self.centernavlogo.setBackgroundImage(pim, for: .normal)


        }

    }).resume()

    Database.database().reference().child("Coupons").child(one1).observe(.childAdded) { (Snapshot : DataSnapshot) in
        if let dict = Snapshot.value as? [String: Any] {
            let captiontext = dict["company name"] as! String
            let offerx = dict["totaloffer"] as! String
            let logocomp = dict["logo"] as! String
            let actchild = dict["childx"] as! String
            let categ = dict["category"] as! String
            let post = Post(captiontext: captiontext, PhotUrlString: actchild, offertext: offerx, actualphoto: logocomp, cat2: categ)
            self.posts.append(post)
            self.tableview.reloadData()

            print(self.posts)
        }
    }
    }) { (error) in
        print(error.localizedDescription)
    }
    trace?.stop()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.

}
func delay(_ delay:Double, closure:@escaping ()->()) {
    let when = DispatchTime.now() + delay
    DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
}

}
extension ViewController : UITableViewDataSource {


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

    let cell = tableview.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath) as! prot

    if cate == 0{
        ///home
        if posts[indexPath.row].cat1 == "" {

        }else{

        }
    }else
    if cate == 1{
    ///shopping
    if posts[indexPath.row].cat1 == "shopping" {

    }
}else
    if cate == 2{
    ///food
    if posts[indexPath.row].cat1 == "food" {

    }
}else
    if cate == 3{
    ///travel
    if posts[indexPath.row].cat1 == "travel" {

    }
}else
    if cate == 4{
    ///event
    if posts[indexPath.row].cat1 == "event" {

    }
}else
    if cate == 5{
    ///more
    if posts[indexPath.row].cat1 == "more" {
            posts.remove(at: indexPath.item)

        DispatchQueue.main.async {
tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.none)
        }
           print("category 5 running")
        }
        tableView.reloadData()
    }
    if cate == 6{
        ///gps
    }

    cell.cllimg?.image = nil
    cell.maintxt.text = nil
    cell.sidetxt.text = nil
    cell.maintxt.text = posts[indexPath.row].caption
    cell.sidetxt.text = "Offers: \(posts[indexPath.row].offercount)"



    let hone = posts[indexPath.row]
    if let maria = hone.actphot {
        let url = URL(string: maria)
        URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in
            if error != nil{
                print(error)
                return
            }
            cell.cllimg?.contentMode = .scaleAspectFit
            DispatchQueue.main.async {

            cell.cllimg?.image = UIImage(data: data!)
            }

        }).resume()
    }

    return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return posts.count
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    passinfo.set("\(posts[indexPath.row].photourl)", forKey: "passinfo")
    self.performSegue(withIdentifier: "yourSegue", sender: self)
}



}

使用上面的代码,选择类别时表格为空白

if cate == 5{
    ///more
    if posts[indexPath.row].cat1 == "more" {
        tableView.beginUpdates()
            posts.remove(at: indexPath.item)
            tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.none)
           print("category 5 running")
        }
        tableView.endUpdates()
    }

使用上面的代码,应用程序崩溃并给我这个错误。

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第0节中的行数无效。更新后现有节中包含的行数(14)必须等于行数更新前包含在该节中 (15),加上或减去从该节插入或删除的行数(0 插入,0 删除),加上或减去移入或移出该节的行数(0 移入, 0 移出)。'

我也尝试删除 posts.remove(at: indexPath.item)tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.none),但都没有成功。

【问题讨论】:

  • 考虑只使用 cate = selects.selectedSegmentIndex 而不是整个 if else 构造。我认为崩溃正是在解释问题所在。

标签: swift uitableview firebase-realtime-database


【解决方案1】:

试着把这条线移到tableView.beginUpdates()之前

posts.remove(at: indexPath.item)

更新后现有节中包含的行数 (14) 必须等于该节中包含的行数 在更新 (15) 之前,加上或减去插入的行数或 从该部分删除(0 插入,0 删除)和加号或减号 移入或移出该部分的行数(0移入,0 搬出去了)。

因为错误提示更新前的帖子数组的计数在更新后也必须相等。

posts.remove(at: indexPath.item)
tableView.beginUpdates()
tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.none)
tableView.endUpdates()

【讨论】:

  • 它似乎可以工作,但是当我尝试在 tableview 上向下滚动时,应用程序崩溃:“由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:部分中的行数无效0. 更新后现有节中包含的行数 (17) 必须等于更新前该节中包含的行数 (19),加上或减去从该节中插入或删除的行数 ( 0 插入,1 删除)和加或减移入或移出该部分的行数(0 移入,0 移出)。'"
  • 那是因为您试图在cellForRowAtIndexPath 中使用deleteRows。尝试在beginUpdatesendUpdates 之间添加deleteRows 并删除tableView.reloadData
  • 好的,我按照你说的做了,但是没有我得到这个错误'致命错误:索引超出范围 2017-10-05 21:47:26.188981-0400 mobile-4charityhelp[40778:2697908] 致命错误:索引超出范围'并且这行代码被标记为'if posts[indexPath.row].cat1 == "more" {'。发生的事情是单元格被删除,但是当我向下滚动到底部时,单元格重新出现,然后应用程序崩溃。
猜你喜欢
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 2022-11-03
  • 2020-12-18
  • 1970-01-01
相关资源
最近更新 更多