无法在按钮点击时重新加载 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的主要内容,如果未能解决你的问题,请参考以下文章