【问题标题】:Not able to reload UICollectionView on button tap无法在按钮点击时重新加载 UICollectionView
【发布时间】:2019-04-08 09:33:24
【问题描述】:

我有一个切换按钮。最初,它将处于关闭模式。因此,当我打开切换开关时,我需要将一组数据传递给集合视图。当它再次关闭时,我需要将一组数据传递给集合视图。

这是我的代码:

@IBAction func cateSelTap(_ sender: Any) {

     isChecked = !isChecked
     if isChecked {
        self.subsetTheCategoryListForClientLogin(isCityLogin: false)
     }else {
        self.subsetTheCategoryListForClientLogin(isCityLogin: true)
     }
}

    func subsetTheCategoryListForClientLogin(isCityLogin: Bool) {
        let cityType = "city"
        print("LOG:CATE1 \(self.categoryarr)")
        var objectIds = [Int]()
        var subsetArray = NSMutableArray()
        for i in 0..<self.categoryarr.count {
            let type = (self.categoryarr.object(at:i) as AnyObject).value(forKey: "type") as! String
            if isCityLogin {
                if type == cityType {
                    subsetArray.add(self.categoryarr.object(at:i) as AnyObject)
                    objectIds.append(i)
                }
            } else {
                if type != cityType {
                    subsetArray.add(self.categoryarr.object(at:i) as AnyObject)
                    objectIds.append(i)
                }
            }
        }
        self.categoryarr.removeAllObjects()
        self.categoryarr = subsetArray
        print("LOG:CATE2 \(self.categoryarr)")
        DispatchQueue.main.async{
            self.categorycollection.reloadData()
//            self.categorycollection.performSelector(onMainThread: #selector(self.categorycollection.reloadData), with: nil, waitUntilDone: true)

        }
    }

当我运行我的应用程序时,当我关闭时 - 我的集合视图数据没有显示确切的数据..仍然显示以前的数据。当我关闭它的完全空白时再次。

有什么帮助吗?

【问题讨论】:

  • 似乎您在按钮操作的两个条件下都使用相同的参数调用subsetTheCategoryListForClientLogin:。此外,您正在对self.categoryarr 应用过滤器并将结果分配给自身。这是在一些开/关循环后集合变为空白的原因。
  • 是的,我将布尔值传递给它。基于该布尔值,只有我的数据将发送到 coll 视图
  • @Akhilrajtr 是的,因为在我的集合视图中,我使用 categoryarr 来显示我的集合视图单元格中的值。所以只有我分配给 categoryarr。如果关闭,则布尔值将为假。如果这是在布尔值上,那将是正确的。仅基于 bool val 我正在附加数据。
  • 如果您需要对原始数组进行条件过滤并在collectionview中显示过滤后的项目,请使用不同的数组作为collection view source并保持原始数据源不变。

标签: ios swift iphone xcode uicollectionview


【解决方案1】:

添加一个新属性,如categoryarr,比如categoryCollectionViewSource,并为其分配初始数据。在集合视图委托方法中使用categoryCollectionViewSource 而不是categoryarr。而在过滤方法中

func subsetTheCategoryListForClientLogin(isCityLogin: Bool) {

    let cityType = "city"
    print("LOG:CATE1 \(self.categoryarr)")
    var objectIds = [Int]()
    var subsetArray = NSMutableArray()
    for i in 0..<self.categoryarr.count {
        let type = (self.categoryarr.object(at:i) as AnyObject).value(forKey: "type") as! String
        if isCityLogin {
            if type == cityType {
                subsetArray.add(self.categoryarr.object(at:i) as AnyObject)
                objectIds.append(i)
            }
        } else {
            if type != cityType {
                subsetArray.add(self.categoryarr.object(at:i) as AnyObject)
                objectIds.append(i)
            }
        }
    }
    //note this line
    self.categoryCollectionViewSource.removeAllObjects()
    self.categoryCollectionViewSource = subsetArray
    print("LOG:CATE2 \(self.categoryarr)")
    DispatchQueue.main.async{
        self.categorycollection.reloadData()
    }
}

【讨论】:

  • categoryCollectionViewSource 是什么类型的财产??
  • categoryarr 属性相同。
  • 我试过了,但是我在单元格中崩溃了,就像在索引方法索引范围 [0.. 3] 这样的单元格中
  • 您可能仍在 collectionview 委托/数据源方法中使用 categoryarr
  • 我修好了...你能帮帮我吗:stackoverflow.com/questions/55590016/….
【解决方案2】:
@IBAction func cateSelTap(_ sender: Any) {
      isChecked = !isChecked
   if isChecked {
         self.subsetTheCategoryListForClientLogin(isCityLogin: false)
   } else {
         self.subsetTheCategoryListForClientLogin(isCityLogin: true)
   }
}

【讨论】:

  • 它在我的帖子中有相同的内容。还加了什么??
  • 你有两次isCityLogin: false;这个有false,然后是true。如果这是解决方案,最好指出这一点。
  • 我变了,然后也没成功
猜你喜欢
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
相关资源
最近更新 更多