0

我有 ViewController 叫myVC和 UITablewView - myTable

我想要的是从代码中添加一些 UIView 作为myTable 的headerView 。所以在myVC的 viewDidLoad() 方法中,我添加了这段代码

    let topView = TopView()
    topView.frame.size.height = 100
    topView.frame.size.width = myTable.frame.width
    myTable.tableHeaderView = featuredEventsView

我还创建了名为 TopView.swift 的文件,看起来像

class TopView : UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)            
        self.backgroundColor = .red
    }

    required init?(coder aDecoder: NSCoder) {.....}
}

它正在按应有的方式工作。我在 myTable 的headerView中看到红色 UIView 。

现在我想在topView中添加 UICollectionView ,我在这里遇到了问题。我正在尝试做类似的事情

class TopView : UIView, UICollectionViewDataSource, UICollectionViewDelegate {
    override init(frame: CGRect) {
        super.init(frame: frame)            
        self.backgroundColor = .red

        addSubview(myCollectionView)
    }

    required init?(coder aDecoder: NSCoder) {.....}

let myCollectionView : UICollectionView = {
        let cv = UICollectionView()
        cv.translatesAutoresizingMaskIntoConstraints = false
        cv.delegate = self as! UICollectionViewDelegate
        cv.dataSource = self as! UICollectionViewDataSource
        cv.backgroundColor = .yellow
        return cv
    }()
}

我还创建了 UICollectionViewDataSource 所需的函数,但构建后应用程序崩溃。我究竟做错了什么?

4

1 回答 1

2

你有两个问题:

1)你初始化你的 UICollectionView 不正确,因为你必须给它一个布局。你需要这样的东西(使用你想要的任何框架,但如果你继续使用自动布局没关系):

let layout = UICollectionViewFlowLayout()
let cv = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)

2) 初始化属性时,不能在闭包内引用“self”。这是因为 if 可能尚未初始化(如本例所示),因此您无法保证使用它是安全的。

我认为如果你使用这样的延迟初始化应该没问题(而且你甚至不需要强制转换'self'):

lazy var myCollectionView : UICollectionView = {
    let layout = UICollectionViewFlowLayout()
    let cv = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
    cv.translatesAutoresizingMaskIntoConstraints = false
    cv.delegate = self
    cv.dataSource = self
    cv.backgroundColor = .yellow
    return cv
}()

使用惰性方法应该延迟到 self 被初始化,因此可以安全使用。

于 2017-06-04T22:33:04.637 回答