segue后屏幕变黑

Posted

技术标签:

【中文标题】segue后屏幕变黑【英文标题】:Screen goes black after segue 【发布时间】:2020-01-27 20:47:31 【问题描述】:

我尝试过调试,但无济于事。

基本上,当我从第一个视图控制器切换到第二个视图控制器时,屏幕会暂时变黑。代码按我的意愿执行,但屏幕变黑对我来说有点痛苦。

代码如下:

第一页的转场:

func mapView(_ mapView: MGLMapView, tapOnCalloutFor annotation: MGLAnnotation) 
        self.performSegue(withIdentifier: "goToSecond", sender: self)
    

第二个视图控制器:

override func viewDidLoad() 
    super.viewDidLoad()
    self.loadDataFromFirebase()

第一个函数:

  func loadDataFromFirebase() 
           let db = Firestore.firestore()
           db.collection(restaurauntName).getDocuments  (snapshot, err) in
              if let err = err 
                 print("Error getting documents: \(err)")
                 return
               else 
                 for document in snapshot!.documents 
                    let name = document.get("Name") as! String
                    let description = document.get("Description") as! String
                    self.names.append(name)
                    self.descriptions.append(description)
                 
                 self.setupImages() //safe to do this here as the firebase data is valid
                 self.collectionView?.reloadData()
              
           
        

此函数设置页面布局

func setupImages()
        self.pages = [
            Page(imageName: self.imagesOne, headerText: names[0], bodyText: descriptions[0]),

            Page(imageName: self.imagesTwo, headerText: names[1], bodyText: descriptions[1]),

            Page(imageName: self.imagesThree, headerText: names[2], bodyText: descriptions[2]),

            Page(imageName: self.imagesFour, headerText: names[3], bodyText: descriptions[3]),

            Page(imageName: self.imagesFive, headerText: names[4], bodyText: descriptions[4]),
        ]

        self.collectionView?.backgroundColor = .white
        self.collectionView?.register(PageCell.self, forCellWithReuseIdentifier: "cellId")

        self.collectionView?.isPagingEnabled = true
    

这设置了页面控件

lazy var pageControl: UIPageControl = 
    let pc = UIPageControl()
    pc.currentPage = 0
    pc.numberOfPages = 5
    pc.currentPageIndicatorTintColor = .red
    pc.pageIndicatorTintColor = .gray
    return pc
()

滑动控制器扩展:

 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat 
        return 0
    

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 

        return pages.count

    

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! PageCell

        let page = pages[indexPath.item]
        cell.page = page
        return cell
    

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
        return CGSize(width: view.frame.width, height: view.frame.height)
    

如果我需要添加任何其他内容,请告诉我!欢迎任何帮助

这是该问题的 youtube 剪辑:

https://www.youtube.com/watch?v=vQGiw3Jd9pM

我后来发现,当我注释掉 firebase 方法时,问题就消失了。

【问题讨论】:

你在哪里调用 mapView(...) ? @claude31 感谢您查看我的问题,mapView() 是在前一个视图控制器上调用的。 segue 工作,它只是在 segue 完成之前变黑:( 什么是segue类型? @claude31 只是常规剧集 注释掉问题消失的firebase方法。这个问题与Firebase无关。它解决问题的原因是它还注释掉了self.setupImages(),这可能是问题所在。在self.collectionView?.backgroundColor = .white 处添加断点并运行应用程序。它会停在那条线上。屏幕是黑的吗?如果不是,则转到下一行并查看,重复冲洗,直到找到使其变黑的行。如果它在该中断之前变黑,那么问题就在该行之前。在此处添加断点“self.loadDataFromFirebase()”,然后重试。 【参考方案1】:

我已经解决了这个问题!问题在于调用函数的顺序。

我没有意识到对于 firebase 来说页面设置得太快了,所以我现在更早地调用了该函数!在视图中会出现

override func viewWillAppear(_ animated: Bool) 
        print("Done")
        super.viewWillAppear(animated)

        self.loadDataFromFirebase()

感谢所有帮助过的人!

【讨论】:

嗯...虽然这“解决”了现在的问题,但它不会是一个长期的解决方案。 “对 Firebase 来说太快”并不是真正的问题,因为 Firebase 与您的 UI 或屏幕变黑完全无关。暂时使用它,但当问题再次出现时循环回来,因为您需要重新访问代码。 @Jay 再次感谢您的跟进和建议!我已经通过降低互联网质量和速度以及超载手机内存来测试它,它似乎工作正常。你认为这意味着问题已经解决还是我只是在问题上贴了创可贴?如果是这样,你能建议任何其他解决方案吗?或测试方法?谢谢 大时代创可贴,恰好解决了这个问题。 Firebase 和 UI 完全不相关,任何 firebase API 调用都“不可能”让你的屏幕变黑。 有什么建议可以解决这个问题吗?再次感谢您的帮助! 暂时没有,但我的猜测是您在某个时候将集合视图的大小调整为整个屏幕的大小,因此它“覆盖”了 viewController。也许这里return CGSize(width: view.frame.width, height: view.frame.height) 值得一看。再次强调,断点是您的朋友,并且将是确定它的唯一方法。【参考方案2】:

看来您的 loadDataFromFirebase() 方法在主线程上执行需要很长时间,导致它挂起。将您的获取移至后台线程并在获取数据后更新您的 UI,同时显示加载指示器或类似的东西。试试:

func loadDataFromFirebase() 
    DispatchQueue.global(qos: .userInitiated).async  [weak self] in 
        // Fetch and convert data
        let db = Firestore.firestore()
        ...
        DispatchQueue.main.async 
             // Update your UI components with the data here
             self.setupImages()
             self.collectionView?.reloadData()
        
    

【讨论】:

您好,感谢您抽出宝贵时间查看我的问题。不幸的是,这并不能解决它:(如果您有任何其他想法,我喜欢尝试它们!我认为解决方案与您的答案一致!我只是想不通 @mick1996 这个答案不正确。 Firebase 在主线程上执行所有 UI 调用,并在后台线程上执行所有网络调用。它永远不会导致 UI 变慢。您不需要在 Firebase 闭包中使用 DispatchQueue,也不需要在不同线程上分配调用,也不需要在其他线程上调用 firebase 函数——它自己处理。请参阅 this question 和“Firebase Frank”答案。

以上是关于segue后屏幕变黑的主要内容,如果未能解决你的问题,请参考以下文章

录制时 Xcode Instrument 屏幕变黑

Unity程序协同问题,传送时屏幕变黑变亮的解决,常规操作的行为集合

展开后执行segue

为啥 webView.setWebChromeClient(new WebChromeClient());导致屏幕变黑?

SceneKit - 为啥添加聚光灯会使地板变黑?

应用程序启动,设备屏幕有时会变黑