无法在按钮点击时重新加载 UICollectionView

Posted

技术标签:

【中文标题】无法在按钮点击时重新加载 UICollectionView【英文标题】:Not able to reload UICollectionView on button tap 【发布时间】: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并保持原始数据源不变。 【参考方案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 我修好了...你能帮帮我吗:***.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。如果这是解决方案,最好指出这一点。 我变了,然后也没成功

以上是关于无法在按钮点击时重新加载 UICollectionView的主要内容,如果未能解决你的问题,请参考以下文章

在使用双参数重新加载页面时,应用程序崩溃。

点击按钮时 UITableView 重新加载数据

在 UIAlertController 之后重新加载视图

如何在点击时重新加载反应原生地图

单击按钮时如何重新加载数据表?

iOS将UIViews数组保存到文件然后重新加载