【问题标题】:Reloading UICollectionview from subview从子视图重新加载 UICollectionview
【发布时间】:2018-02-21 17:50:48
【问题描述】:

我从我的 uicollectionviewcell 之一调用全屏子视图。此子视图将新单元格添加到集合视图。在我从其父视图(uicollectionview)中删除此子视图本身之前,我从 uicollectionviewcontroller 中的子视图本身调用更新函数,如下所示,

func update() {
   self.uicollectionview?.reloadData()
}

但是在我终止应用程序并重新打开它之前,什么都没有发生。我还使用了异步出队。但没有任何改变。任何帮助将不胜感激。 谢谢,

更新 1:

我从我的子视图中调用以下方法。在一些动画之后,子视图将自己从父视图中移除并在父视图控制器中调用更新函数。我还交换了行并将 removeFromSubview 方法作为最后一次调用。但它没有用。

    func tapHandler(sender: UITapGestureRecognizer? = nil) {
    if sender?.state == .ended {
        UIView.animate(withDuration: 0.2, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .transitionCurlDown, animations: {
            self.recordButton.frame = CGRect(origin: self.recordButton.center, size: CGSize(width: 0, height: 0))
            self.timerLabel.frame = CGRect(origin: self.timerLabel.center, size: CGSize(width: 0, height: 0))
            self.circularProgressBar.frame = CGRect(origin: self.circularProgressBar.center, size: CGSize(width: 0, height: 0))

        }, completion: { (completed) in
            UIView.animate(withDuration: 0.2, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .transitionCurlDown, animations: {
                self.recorderView.frame = CGRect(origin: self.recorderView.center, size: CGSize(width: 0, height: 0))
                self.blurEffectView.effect = nil
            }, completion: { (animationCompleted) in


                self.removeFromSuperview()

                print("I am finished")
                let hdsc = HomeDatasourceController()
                hdsc.update()


            })
        })
    }
}

superview控制器中的更新方法如下

    func update() {
    print("update() func called")
    DispatchQueue.main.async {
        self.collectionView?.reloadData()
    }

子视图在超级视图控制器中也被定义为弱变量

weak var audioPlayerView: AudioPlayerView?
weak var audioRecorderView: AudioRecorderView?

【问题讨论】:

  • 是否在主线程上调用更新? uiCollectionView 引用是否为非 nil
  • 替换行 self.uicollectionview!.reloadData() 如果这是 nil 它将崩溃。
  • 那你就可以找出问题所在了
  • 所以我测试了你的代码,虽然这个条件是真的:如果 sender?.state == .ended 它工作,你的collectionview没有重新加载由于这个代码......:让hdsc = HomeDatasourceController () hdsc.update() .... HomeDatasourceController() 做了什么看起来很奇怪,因为在这里你应该在已经存在的集合视图上调用更新,你是用那个代码创建它吗?
  • homedatasource Controller是collectionview控制器(app的主控制器)。我在我的记录器子视图中创建了 homedata sourcecontroller 的实例,以调用 homedatasourcecontroller 中的 update() 函数。当我调用更新时,我看到调用了 homedatasourcecontroller 的 viewdidload。也许你是对的,也许我无法解决已经存在的 homedatasourcecontroller。

标签: ios swift swift3 uicollectionview reload


【解决方案1】:

我解决了我自己的问题。我忘了提到我正在为我的集合视图使用 LBTA 组件 API。在我将新对象添加到数据源之后,我只是在更新函数中再次重置了我的数据源,现在它可以运行了。

    func update() {
    print("update() func called")
    let hds = HomeDataSource()
    self.datasource = hds
    collectionView?.reloadData()
}

但很奇怪,我原以为 reloadData() 函数会为我做这件事……感谢所有帮助我完成任务的人……

【讨论】:

    【解决方案2】:

    尝试在主线程上调度重新加载。

    dispatch_async(dispatch_get_main_queue(),{ [weak self] in
        self?.uicollectionview?.reloadData()
    })
    

    【讨论】:

    • 我回家后会试试这个,然后给大家一个反馈。谢谢现在,令人难以置信的是我得到了一些答案的速度有多快!..
    • 上述代码的更新版本是DispatchQueue.main.async { self.collectionView?.reloadData() } ,但它不起作用。 :(
    • 好的,现在我们需要您提供更多代码来帮助您,向我们展示添加更多单元格的方法。我现在在想,如果您要插入单元格,则不需要重新加载。
    • 我添加了更新。我希望我能解释这个问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2021-09-30
    • 2015-01-15
    • 1970-01-01
    相关资源
    最近更新 更多