UICollectionView 不重新加载数据

Posted

技术标签:

【中文标题】UICollectionView 不重新加载数据【英文标题】:UICollectionView does not reloadData 【发布时间】:2015-08-15 13:53:21 【问题描述】:

我正在尝试在我的使用 Parse 的应用程序中实现搜索功能,并希望使用重新加载数据对 PFObjects 进行排序。我的应用程序可以第一次执行 reloadData(),但它在第一次之后返回“在展开可选值时意外发现 nil”。我尝试在 mainThread 中执行 reloadData 并在我的 collectionView 中删除弱引用,但它仍然不起作用。我在下面附上了我的代码。提前谢谢!

@IBOutlet var collectionView: UICollectionView!

override func viewDidLoad() 
    super.viewDidLoad()

    loadCollectionViewData()


//This method is also conducted when the user taps search button
func loadCollectionViewData()
    let ud = NSUserDefaults.standardUserDefaults()

    var query = PFQuery(className: "Posts")


    if ud.objectForKey("searchKeyFromVCKey") != nil
        //This is keyword the user puts in
        var searchKey = ud.objectForKey("searchKeyFromVCKey") as! String
        println("searchKey \(searchKey)")

        if searchKey != "" 
            //If a user is searching something...
            query.whereKey("searchTag", containsString: searchKey.lowercaseString)
        

    query.findObjectsInBackgroundWithBlock 
        (objects: [AnyObject]?, error: NSError?) -> Void in


        if error == nil 

           postObject.removeAll(keepCapacity: false)

            if let object = objects as? [PFObject] 
                postObject = object


            

            self.collectionView.reloadData() //This works the first time when I conduct loadCollectionViewData() in ViewDidLoad

         else 
            // Log details of the failure
            println("Error: \(error!) \(error!.userInfo!)")


        

    
    ud.removeObjectForKey("searchKeyFromVCKey")


【问题讨论】:

哪个引用意外为零? @AaronBrager 我不知道如何找到哪个引用意外为零。使用此代码,self.collectionView.reloadData() 以绿色突出显示,并发生错误。 postObject = object改成postObject = object! @DDPWNAGE 当我尝试这样做时,Xcode 显示错误“后缀的操作数'!'应该有可选类型;类型是 '[PFObject]'" @Emily 好的。在其中添加 if (object == nil) 语句。 【参考方案1】:

如果您在此行收到错误...

self.collectionView.reloadData()

.. 那么 selfcollectionView 都可以为 nil。要检查这一点,只需在这一行上放置一个断点并检查哪个是 nil - self 或 collectionView。如果您不知道如何在调试器中设置断点和检查值,请搜索教程 - 这很简单,但在这里需要解释很多。如果您想继续编程,无论如何都必须学习这一点。

并且:从 collectionView 中删除“弱”是一个坏主意,因为它可能导致引用循环和内存泄漏。

【讨论】:

【参考方案2】:

也许原因就在这里:

println("Error: \(error!) \(error!.userInfo!)")

userInfo 是一个可选值,你确定它不是一个 nil 值吗?

找到原因的最好方法是开启异常断点,然后我们会得到更多的崩溃信息来帮助我们解决它。

【讨论】:

以上是关于UICollectionView 不重新加载数据的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 不重新加载数据

UICollectionView 在重新加载数据时滚动不平滑

如何在 UICollectionView 中加载更多数据而不重新加载所有数据

iOS 9 UICollectionView 水平重新加载数据不起作用

在单元格文本字段的 textFieldShouldEndEditing 方法中调用 UICollectionView 重新加载数据不起作用

uicollectionview 在重新加载数据后立即选择一个项目?