集合视图/选项卡栏控制器崩溃

Posted

技术标签:

【中文标题】集合视图/选项卡栏控制器崩溃【英文标题】:Collection View/Tab Bar Controller Crashes 【发布时间】:2018-10-26 16:09:45 【问题描述】:

在我的应用程序中,我使用 Tab Bar 控制器在视图控制器之间切换,并且在每个视图控制器上我使用集合视图然后转到不同的页面。当我在计算机上运行该应用程序时,一切正常。问题是当我在手机上运行该应用程序时。每当我单击选项卡栏控制器中的选项卡时,该选项卡会转到带有集合视图控制器的页面,应用程序会冻结然后崩溃。我认为我已将问题缩小到集合视图控制器,因为当没有集合视图控制器时,我手机上的应用程序不会崩溃。它仅在使用集合视图控制器时崩溃。这可能是什么原因造成的?我看过,但没有发现任何类似的问题。

这是其中一个集合视图控制器的代码:

import UIKit
class HighSchoolController: UIViewController, \UICollectionViewDataSource, UICollectionViewDelegate 

    var identities = [String]()

    let hsImage: [UIImage] = [
        UIImage(named: "dates")!,
        UIImage(named: "athletics_icon")!,
        UIImage(named: "interm-1")!,
        UIImage(named: "lunch_icon")!,
        UIImage(named: "pioneerpress")!,
        UIImage(named: "PIONEERNEWS")!,
        UIImage(named: "clubs_icon")!,
        UIImage(named: "contact_icon")!
    ]

    override func viewDidLoad() 
        super.viewDidLoad()

        identities = ["events", "athletics", "da", "lunch", "pioneer press", "pioneer news", "clubs", "contact"]

        //Navigationbar Shadow
        self.navigationController?.navigationBar.layer.shadowColor = UIColor.black.cgColor
        self.navigationController?.navigationBar.layer.shadowOffset = CGSize(width: 0.0, height: 4.0)
        self.navigationController?.navigationBar.layer.shadowRadius = 9.0
        self.navigationController?.navigationBar.layer.shadowOpacity = 0.9
        self.navigationController?.navigationBar.layer.masksToBounds = false

        // Do any additional setup after loading the view.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return hsImage.count
    

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        let hsCell = collectionView.dequeueReusableCell(withReuseIdentifier: "hsCell", for: indexPath) as! HighSchoolCell


        hsCell.hsImage.image = hsImage[indexPath.item]

        hsCell.layer.cornerRadius = (hsCell.layer.frame.height) / 2.0;
        hsCell.layer.masksToBounds = true

        return hsCell
    

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
        let vcName = identities[indexPath.row]
        let viewController = storyboard?.instantiateViewController(withIdentifier: vcName)
        self.navigationController?.pushViewController(viewController!, animated: true)
    

【问题讨论】:

附上崩溃日志 【参考方案1】:

我通过在我的标签栏控制器中执行此操作解决了这个问题

让 layout1 = UICollectionViewFlowLayout() 让 cv1 = CollectionView1(collectionViewLayout: layout1)

让 layout2 = UICollectionViewFlowLayout() 让 cv2 = CollectionView1(collectionViewLayout: layout2)

让 layout3 = UICollectionViewFlowLayout() 让 cv3 = CollectionView1(collectionViewLayout: layout3)

让 layout4 = UICollectionViewFlowLayout() 让 cv4 = CollectionView1(collectionViewLayout: layout4)

【讨论】:

【参考方案2】:

在我看来,它一定在您的self.navigationController?... 行上崩溃了。我的猜测是您使用CollectionViewController 作为TabBarController 中选项卡的rootViewController

如果要使用navigationController 在选项卡内导航,则需要附加navigationController 作为选项卡的根,然后将CollectionViewController 设置为navigationControllerrootViewController .

您需要像TabBarController > NavigationViewController > CollectionViewController 这样的层次结构,而不是TabBarController > CollectionViewController 的层次结构

【讨论】:

以上是关于集合视图/选项卡栏控制器崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何从 UICollectionView 单元中引用选项卡栏控制器

应用内购买:视图消失时崩溃

仅使用一个视图控制器的具有多个选项卡的选项卡栏

如何使用新数据重新加载或刷新选项卡栏控制器的选项卡栏中的数据?

如何在保留选项卡栏的同时将子视图控制器添加到选项卡式视图控制器?

如何在选项卡栏控制器中更新选项卡上的视图