【问题标题】:Update Collection View from View Controller Swift从视图控制器 Swift 更新集合视图
【发布时间】:2017-12-13 23:05:30
【问题描述】:

我的storyboard 中有这个。

ViewController -> Tableview -> 自定义单元格

自定义单元格在集合视图中。

在我的ViewController 中,我有一些过滤器按钮,我想过滤集合视图的数组数据并重新加载它。

所以我尝试用下面的代码做一个委托方法

protocol ReloadTheDataDelegate: class {
    func reloadTheCV()
}


class NearMeViewController: UIViewController {
    weak var delegate: ReloadTheDataDelegate?

@IBAction func anAction(_sender : AnyObject){

requests.weekendEventData.sort() { $0.realDate < $1.realDate }
delegate?.reloadTheCV()

}

}


class WeekendTableViewCell: UITableViewCell, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource, UICollectionViewDelegate, ReloadTheDataDelegate  {

@IBOutlet public weak var weekendCV: UICollectionView!

func reloadTheCV() {
        print("done")  //never printed
        weekendCV.reloadData()
    }

    override func awakeFromNib() {
        super.awakeFromNib()


        if let myViewController = parentViewController as? NearMeViewController {
            myViewController.delegate = self
        }

        weekendCV.register(UINib(nibName: "WeekendCollectionViewCell", bundle: nil),
                           forCellWithReuseIdentifier: "phoneweekendcell")

        weekendCV.delegate = self
        weekendCV.dataSource = self
    }
}

以及我采用 ViewController 的扩展

extension UIView {
    var parentViewController: UIViewController? {
        var parentResponder: UIResponder? = self
        while parentResponder != nil {
            parentResponder = parentResponder!.next
            if let viewController = parentResponder as? UIViewController {
                return viewController
            }
        }
        return nil
    }
}

谁能解释为什么函数reloadTheCV() 从未被调用?

【问题讨论】:

  • 我在这里很困惑。为什么在表格视图单元格中有一个集合视图?而且,当您说ViewController -&gt; Tableview -&gt; Custom cell 时,您的意思是它们彼此重叠,对吗?没有通过 segue 连接?
  • @FangmingNing 它有点像 netflix 应用程序......是的,它是另一个的顶部
  • 好的。那为什么你的牢房里有一个UICollectionView?你的过滤器按钮在哪里?我认为您需要的只是在单击过滤器按钮时过滤并重新加载表格视图,对吧?
  • @FangmingNing “你为什么在表格视图单元格中有一个集合视图?” - 这实际上并不少见,一种情况是每个表格行是一个单独的内容类别,集合视图中只有一行,可滚动到两侧。集合视图位于表格行内,因此它们可以独立滚动。这种布局在 VOD 应用中很常见

标签: ios swift swift3


【解决方案1】:

NearMeViewController 代表 (ReloadTheDataDelegate ) 是 nil。由于它不打印。您没有设置delegate,这种方法也太复杂了。

所以,而不是接近protocol 概念。只需通过以下方式重新加载单元格的集合视图。

在您的NearMeViewController 上添加以下功能。并在您需要重新加载集合视图时调用。

func reloadCellCV() {
        for cell in tableView.visibleCells {
            if let cell = cell as? WeekendTableViewCell {
                DispatchQueue.main.async {
                    cell.weekendCV.reloadData()
                }
            }
        }
    }

【讨论】:

  • 是的,它的工作原理.. 虽然如果我知道为什么代表是 nil 那就太好了!
  • 您必须在创建单元格时将单元格对象设置为您的NearMeViewController 委托。如果你有多个单元格,这种方法将不起作用。因为一个单元格对象将替换另一个单元格对象。
  • 感谢@SubramanianP 在花了无数个小时之后,我得到了这个解决方案。
猜你喜欢
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2016-07-28
  • 1970-01-01
相关资源
最近更新 更多