目前的视图显示黑屏,为什么?

时间:2017-06-02 17:00:04

标签: ios swift viewcontroller

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

我在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)
}

但实际调用此功能时,它会显示黑屏而不显示任何错误。你能告诉我为什么吗?

8 个答案:

答案 0 :(得分:1)

尝试通过抓取故事板引用来添加newviewcontroller。并使用instantiateviewcontrollerwithidentifier函数。

答案 1 :(得分:0)

我遇到了相同的问题,尝试在按下按钮时显示视图控制器。最初我尝试使用以下方法:-

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

为了解决此错误,我添加了故事板ID(在我的情况下为“ paper”),并使用了对我有用的InstantiateViewController。

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

答案 2 :(得分:0)

如果XIB大小写,请仔细检查VCXIB的名称是否相同:

不正确:

DebugLogsVC.swift
DebugLogs.xib

正确:

DebugLogsVC.swift
DebugLogsVC.xib

当前:

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

答案 3 :(得分:0)

就我而言,使用 .xib 文件时,问题在于未设置 .xib 文件所有者的目标成员资格。

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

enter image description here

答案 4 :(得分:-1)

如果你在故事板中创建了NewViewController,那么实例化就不会从那里获得ui接口。

您可以尝试在故事板上为其分配StoryBoardId并尝试:

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

   // your code

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

如果控制器与演示控制器位于同一故事板中。或者您可以创建一个segue,调用segue并在“prepareForSegue”中设置新的控制器数据。

答案 5 :(得分:-1)

在我的案例中,我也使用了各种viewControllers,即UIAlertControllerCustom nib UIViewControllerStoryboard UIViewController和{{{ 1}}。我不确定这是Hard Coded UIViewController上的错误,但要解决此问题,我会在延迟一段时间后在Apple上提出viewController

这是我的代码。

viewDidAppear

基本上它的作用是,它在呈现另一个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) } 之前等待视图完全呈现。

答案 6 :(得分:-1)

我喜欢将视图控制器的演示文稿放在像您一样的方法中并使用

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

在viewDidAppear中显示它。但是,我发现我必须使用延迟值,因为在模拟器中它使用0.2,但在设备上它可能没有。 Apple无法为开发人员提供可以安全显示新视图的活动,这真令人讨厌。

希望这有助于某人。

答案 7 :(得分:-2)

尝试以下方法:

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)