【问题标题】:Present view shows black screen, why?当前视图显示黑屏,为什么?
【发布时间】:2017-06-02 17:00:04
【问题描述】:

我正在制作一个应用程序,如果特定日期已过,它会在启动应用程序后呈现一个视图控制器。问题是:它只是返回一个黑屏。 我已经测试了它将呈现的视图控制器设置为初始视图控制器并且它工作得很好;没有黑屏。因此,我的错误必须在代码中。

我在viewDidAppear()中调用这个函数:

if date.hasPassed {
        presentView(fromDate: date)
    }

这不是实际的代码,它更像是一个简化版本。在我的情况下,日期是数组中的自定义对象。该对象将其属性保存到 UserDefaults 以便它们可以显示在出现的视图控制器中。我的presentView(fromDate: date) 函数如下:

func presentView(fromDate: date) {
    let vc = NewViewController()

    let title = date.title ?? "My date"
    let description = date.description ?? "My description"

    UserDefaults.standard.set(title, forKey: "title")
    UserDefaults.standard.set(description, forKey: "description")
    UserDefaults.standard.synchronize()

    self.present(vc, animated: true, completion: nil)
}

但是当实际调用这个函数时,它会显示一个黑屏而没有显示任何错误。你能告诉我为什么吗?

【问题讨论】:

  • NewViewController 中有什么?它可能只是一个空白的黑屏。
  • 它只是一个带有一些标签的普通视图控制器......不要认为这是问题......
  • 这段代码是从你的启动视图控制器执行的吗?您是否尝试过延迟执行?
  • 是的...也没有用:(
  • 因为你的 NewViewController 是一个自定义类。如果它在情节提要中,您可以在属性检查器中更改背景颜色。或者在自定义类的 viewDidLoad 中执行 view.backgroundColor = UIColor.green。或者从上面的代码中,在这行'let vc = NewViewController()'之后添加 vc.backgroundColor = UIColor.green

标签: ios swift viewcontroller


【解决方案1】:

如果您在 storyboard 中创建了 NewViewController,那么这样实例化不会从那里获得 ui 界面。

您可以尝试在情节提要上为其分配 StoryBoardId 并尝试:

func presentView(fromDate: date) {
   let newViewController = self.storyboard.instantiateViewController(withIdentifier: "NewControllerIdentifier")

   // your code

  self.present(vc, animated: true, completion: nil)
}

如果控制器与您的演示控制器位于同一情节提要中。或者您可以为其创建一个转场,调用转场并在“prepareForSegue”中为您设置新的控制器数据。

【讨论】:

  • 这个对我有用,谢谢!
【解决方案2】:

尝试通过获取故事板参考来添加 newviewcontroller。并使用带有标识符的实例化视图控制器。

【讨论】:

  • 也没有工作...也许你不能在viewDidAppear()中调用这个函数?你怎么看?
【解决方案3】:

尝试以下方法:

let bundle = Bundle.main
let storyboard = UIStoryboard(name: "Main", bundle: bundle)
var newViewController: UIViewController!
newViewController = storyboard.instantiateViewController(withIdentifier: "NewControllerIdentifier")
present(newViewController, animated: true, completion: nil)

【讨论】:

  • 这个答案可以通过稍微解释一下为什么值得尝试来改进。
【解决方案4】:

在我使用各种viewControllers 的情况下,这种情况也经常发生,即UIAlertControllerCustom nib UIViewControllerStoryboard UIViewControllerHard Coded UIViewController。我不确定这是否是 Apple 上的错误,但为了解决这个问题,我在一段时间延迟后在 viewDidAppear 上提出了 viewController

这是我的代码。

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    // 1 second delay so the views will render first before presenting the alert
    Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.presentTheAlert), userInfo: nil, repeats: false)
}

func presentTheAlert() {
    let alertController = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
    alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil))
    self.present(alertController, animated: true, completion: nil)
}

所以本质上它的作用是,它等待视图完全呈现,然后再呈现另一个viewController

【讨论】:

    【解决方案5】:

    我喜欢将视图控制器的呈现方式放在和你一样的方法中并使用

    - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;
    

    在 viewDidAppear 中显示它。但是,我发现我不得不使用延迟值,因为在模拟器中它适用于 0.2,但在设备上可能不会。 Apple 不能为开发者提供一个可以安全显示新视图的事件,这真的很烦人。

    希望这对某人有所帮助。

    【讨论】:

      【解决方案6】:

      我遇到了同样的问题,我尝试在按下按钮时显示视图控制器。最初我正在尝试以下操作:-

          @IBAction func buttonPressed(_ sender: Any) {
              let vc = PaperViewController()
              self.present(vc, animated: true, completion: nil)
          }
      

      为了解决这个错误,我添加了故事板 ID,在我的例子中是“纸”,并使用了对我有用的实例化视图控制器。

         @IBAction func buttonPressed(_ sender: Any) {
              if let vc = self.storyboard?.instantiateViewController(withIdentifier: 
           "paper") {
              self.present(vc, animated: true, completion: nil)
          }
       }
      

      【讨论】:

        【解决方案7】:

        如果是XIB 情况请仔细检查VCXIB 是否具有相同的名称:

        不正确:

        DebugLogsVC.swift
        DebugLogs.xib
        

        正确:

        DebugLogsVC.swift
        DebugLogsVC.xib
        

        现在:

        let vc = DebugLogsVC()
        self.present(vc, animated: true, completion: nil)
        

        【讨论】:

          【解决方案8】:

          在我的例子中,对于 .xib 文件,问题是 .xib 文件所有者的目标成员资格没有设置。

          要查看它是否适用于您的情况,请检查文件检查器的“目标成员”部分。

          【讨论】:

            猜你喜欢
            • 2012-08-13
            • 2019-12-18
            • 2010-12-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-02-07
            • 2021-07-24
            • 1970-01-01
            相关资源
            最近更新 更多