继承UICollectionViewController后导航栏与搜索栏不显示的解决方法
问题描述
我正在跟随视频课程基于Unsplash实现图片图库。最初我将PhotoCollectionViewController继承自UIViewController,并手动编写代码添加导航栏和搜索栏:
class PhotoCollectionViewController: UIViewController
导航栏设置代码如下:
//MARK: - Nav bar inelkaar steken hier private func setupNavigationBar(){ let titleLabel = UILabel() titleLabel.text = "Photos" titleLabel.font = UIFont.systemFont(ofSize: 15) titleLabel.textColor = .black navigationItem.leftBarButtonItem = UIBarButtonItem.init(customView: titleLabel) navigationItem.rightBarButtonItems = [addBarButtonItem, actionBarButtonItem] }
此时导航栏和搜索栏可正常显示。之后发现继承关系有误,需改为继承UICollectionViewController,修改后编译无问题,但导航栏和搜索栏不再显示,请问该如何解决?
解决方案
确认导航栏设置方法的调用时机
切换到UICollectionViewController后,检查setupNavigationBar()是否在viewDidLoad或viewWillAppear等生命周期方法里被调用。比如在viewDidLoad中添加:override func viewDidLoad() { super.viewDidLoad() setupNavigationBar() }确保控制器被导航控制器包裹
UICollectionViewController本身不会自带导航栏,必须被嵌入到UINavigationController中才能显示导航栏。如果是代码初始化,要这样做:let layout = UICollectionViewFlowLayout() let collectionVC = PhotoCollectionViewController(collectionViewLayout: layout) let navController = UINavigationController(rootViewController: collectionVC) // 再将navController作为根控制器或present展示如果用Storyboard,要确保
PhotoCollectionViewController是导航控制器的根视图控制器,或者通过segue连接到导航控制器。检查搜索栏的添加逻辑
如果搜索栏是手动添加到视图的,要确认添加代码是否执行,且父视图正确。比如可以把搜索栏放到集合视图的头部:// 注册头部视图 override func viewDidLoad() { super.viewDidLoad() collectionView.register(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "SearchHeader") } // 提供头部视图 override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "SearchHeader", for: indexPath) let searchBar = UISearchBar(frame: header.bounds) searchBar.placeholder = "Search photos" header.addSubview(searchBar) return header } // 设置头部高度 override func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { return CGSize(width: collectionView.frame.width, height: 56) }强制显示导航栏
在视图即将出现时,确保导航栏没有被隐藏:override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) navigationController?.isNavigationBarHidden = false }
内容的提问来源于stack exchange,提问作者pl7771
相关产品推荐
相关产品推荐

