从View Controller Swift更新集合视图

时间:2017-07-10 09:20:51

标签: ios swift swift3

我在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()吗?

1 个答案:

答案 0 :(得分:2)

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()
                }
            }
        }
    }