我正在创建一个基本应用程序,只是为了学习快速编程的新概念,我有一个普遍的问题: 在我的根视图控制器中,我有一个集合视图。在此集合视图中,在每个单元格中,我想显示一个不同的UIViewController,其中附加了不同的UINavigationController。我没有担心,因为我没有这样做: 1.那件事甚至可能吗?这是一个好习惯吗? 2.最佳做法是什么?初始化视图控件并将它们分配给cellForItemAt中的每个单元格? 3.是否需要缓存视图控制器?
那些是主要的麻烦制造者。 SectionViewController假定是我的主屏幕视图,其中包含导航栏和另一个模拟选项卡栏的UICollectionView。在标签栏下,我想要有问题的UICollection视图。请注意,这段代码只是一个通用结构,因为我真的不知道下一步该怎么做。
class SectionViewController: UIViewController {
let mainView: UIView = {
let view = UIView()
view.backgroundColor = UIColor.green
return view
}()
let sections = HomeCollectionView()
var menuBar: MenuBar? = nil
var settingsLauncher = SettingsLauncher()
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.title = "Home"
let titleLabel = UILabel(frame: CGRect(x: 0, y: 0, width: view.frame.width - 32, height: view.frame.height))
titleLabel.textColor = UIColor.white
titleLabel.text = "Home"
navigationItem.titleView = titleLabel
navigationController?.navigationBar.isTranslucent = false
setupMenuBar()
setupNavigationButtons()
}
private func setupNavigationButtons(){
var dotsImage = UIImage(named: "3dots")?.withRenderingMode(.alwaysOriginal)
dotsImage = UIImage.resizeImage(image: dotsImage! , newWidth: 20)
let dots = UIBarButtonItem(image: dotsImage , style: .plain, target: self, action: #selector(optionsMenuAction))
navigationItem.rightBarButtonItem = dots
}
@objc func optionsMenuAction(){
settingsLauncher.showSettings()
}
private func setupMenuBar(){
// add menu bar and constraints for menu bar
menuBar = MenuBar()
view.addSubview(self.menuBar!)
view.addSubview(sections)
view.addConstraintsWithFormat(format: "H:|[v0]|", views: self.menuBar!)
view.addConstraintsWithFormat(format: "H:|[v0]|", views: self.sections)
view.addConstraintsWithFormat(format: "V:|[v0(30)][v1]|", views: self.menuBar! , self.sections)
}
}
class HomeCollectionView: UIView , UICollectionViewDelegate , UICollectionViewDataSource , UICollectionViewDelegateFlowLayout {
override init(frame: CGRect){
super.init(frame: frame)
collectionView.register(SectionCell.self, forCellWithReuseIdentifier: cellID)
addSubview(collectionView)
addConstraintsWithFormat(format: "H:|[v0]", views: collectionView)
addConstraintsWithFormat(format: "V:|[v0]", views: collectionView)
}
lazy var collectionView: UICollectionView = {
let layout = UICollectionViewFlowLayout()
layout.minimumLineSpacing = 0
layout.scrollDirection = .horizontal
let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
cv.backgroundColor = UIColor.yellow
cv.delegate = self
cv.dataSource = self
return cv
}()
let cellID = "SectionCell"
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 4
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellID, for: indexPath)
cell.backgroundColor = UIColor.blue
return cell
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: frame.width, height: frame.height)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
编辑: 看来这不是达到我目的的最佳做法。我的最终目标是创建一个具有UICollectionViewController子视图的控制器,该控制器在每个单元格中拥有一个代表我应用程序页面的不同UIView,您可以在它们之间滑动。我有自定义的NavBar,所以我不想使用分页控制器。
我已经有了这个标签栏,我需要将其与下面的CollectionView连接。但首先要注意的是:我需要找出在单元内部加载不同UIView的最佳方法。我是否需要一次全部创建它们以保存其实例?