0

我需要存储一个视图以用作 UICollectionView 标头。我不希望它循环出内存,因为它需要保留其状态/数据等。

使用表格视图,您可以做到tableView.tableHeaderView = view

这是我正在尝试的:

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {

        switch kind {
        case MagazineLayout.SupplementaryViewKind.sectionHeader:
            if let t = headerView { //headerView is an instance var
                return t
            } else {
                let view = collectionView.dequeueReusableSupplementaryView(ofKind: MagazineLayout.SupplementaryViewKind.sectionHeader, withReuseIdentifier: "MyHeaderView", for: indexPath) as! MyHeaderView
                view.titleLabel.text = "test"
                view.switch.addAction(for: .valueChanged, { [weak self] in
                    self?.switchValueChanged()
                })
                headerView = view
                return view
            }
        ...
    }

我不想每次用户滚动它然后返回时都重新创建它,所以我试图存储对它的引用。这虽然行不​​通。很难解释,但它显示的视图被切断并且开关没有响应。如果我注释掉“if”部分并每次只创建一个新部分,它看起来正确但状态丢失(即开关关闭) 最好的方法是什么?

4

1 回答 1

0

由于您保留引用并且在它滚动出视图时不让它释放,因此完全删除registerand dequeuing。对我来说效果很好,方法如下:

let view = MyHeaderView()
override func viewDidLoad() {
    super.viewDidLoad()
    view.titleLabel.text = "test"
    view.switch.addAction(for: .valueChanged, { [weak self] in
        self?.switchValueChanged()
    })
}
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    switch kind {
    case MagazineLayout.SupplementaryViewKind.sectionHeader:
        return view
        //...
    }
}
于 2020-07-07T05:04:51.547 回答