Swift还很新,阅读了解“最佳实践”,我试图重构一些简单的代码,但无法绕过选项并将简单的UICollectionView
放在一个简单的代码中UIViewController
。UIViewController中的集合视图可选的展开崩溃
我有什么,它的工作原理
class AddFriendsController: UIViewController {
fileprivate let cellId = "cellId"
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(handleCancel))
let layout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 20, left: 10, bottom: 10, right: 10)
layout.itemSize = CGSize(width: 111, height: 111)
let collectionViewTest = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
collectionViewTest.delegate = self
collectionViewTest.dataSource = self
collectionViewTest.register(UserFriendCell.self, forCellWithReuseIdentifier: cellId)
view.addSubview(collectionViewTest)
collectionViewTest.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
collectionViewTest.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
collectionViewTest.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
collectionViewTest.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true
}
@objc private func handleCancel() {
self.dismiss(animated: true, completion: nil)
}
}
extension AddFriendsController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 2
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 9
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! UserFriendCell
return cell
}
}
我想什么它是像
class AddFriendsController: UIViewController {
fileprivate let cellId = "cellId"
private weak var collectionViewTest: UICollectionView?
private weak var layout: UICollectionViewFlowLayout?
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(handleCancel))
layout = UICollectionViewFlowLayout()
layout!.sectionInset = UIEdgeInsets(top: 20, left: 10, bottom: 10, right: 10)
layout!.itemSize = CGSize(width: 111, height: 111)
collectionViewTest = UICollectionView(frame: self.view.frame, collectionViewLayout: layout!)
collectionViewTest!.delegate = self
collectionViewTest!.dataSource = self
collectionViewTest!.register(UserFriendCell.self, forCellWithReuseIdentifier: cellId)
view.addSubview(collectionViewTest!)
collectionViewTest!.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
collectionViewTest!.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
collectionViewTest!.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
collectionViewTest!.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true
}
@objc private func handleCancel() {
self.dismiss(animated: true, completion: nil)
}
}
extension AddFriendsController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 2
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 9
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! UserFriendCell
return cell
}
}
这样做是因为我想尝试从应用“最佳实践”开始学习斯威夫特,即从我所了解的这种情况下尽可能多的东西private
和weak
ify /“optionalize”views/outlets,以避免保留c ycles。
问题
应用崩溃,因为爆炸在layout!.sectionInset
水平展开一个零。
任何善良的灵魂愿意开导我吗?
在此先感谢。
为什么你布局属性弱?它保留视图控制器吗?你为什么不从声明中初始化它?所以你不需要强制unwrap:'private let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout()' –