iOS - 设置'rootViewController'仅在设备上产生黑屏

mbr*_*ber 6 ios swift

使用非常基本的单一视图应用程序,我删除了主故事板文件并删除了对它的任何引用.因此我以编程方式设置窗口rootViewController.但是,虽然这会在模拟器中正确显示单个视图(包含标签),但在设备上运行时会显示黑屏.这是该应用程序的唯一代码.

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.rootViewController = DummyViewController()
        window?.makeKeyAndVisible()
        return true
    }
Run Code Online (Sandbox Code Playgroud)

我已从info.plist文件中删除了主故事板的条目,以及常规设置中的"主界面"条目.

我正在使用Swift 3并定位iOS 8设备.我正在使用XCode 8.3.1.

控制台中没有输出,也没有例外.viewDidLoad函数甚至在断点上触发,因此代码路径似乎正在正确运行.

有任何想法吗?

这是DummyViewController根据请求的简单代码.

class DummyViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}
Run Code Online (Sandbox Code Playgroud)

一般设置显示没有对主界面的引用 在此输入图像描述

这是链接到DummyViewController的.xib的图像 在此输入图像描述

**解决这种情况的解决方案是手动指定.xib加载DummyViewController**

Car*_*ter 3

ViewController 似乎未设置为显示任何内容。除非您使用 xib(在这种情况下您需要以不同的方式加载视图控制器,请参见下文),否则没有任何内容描述 ViewController 的视图应如何呈现。

要测试这一点,您可以将该行添加self.view.backgroundColor = UIColor.red到 ViewController 的viewDidLoad()方法中,然后在设备上再次运行它 - 如果背景颜色变成红色,那么万岁!下一步将以编程方式添加 UILabel。


从 XIB 加载 UIViewController

let vc = MyViewController(nibName: "xibname", bundle: nil)

或者,您可以通过在内部添加自定义 init 来屏蔽加载MyViewController

class MyViewController: UIViewController {
    required init() {
        super.init(nibName: "xibname", bundle: nil)
    }
}
Run Code Online (Sandbox Code Playgroud)

(感谢zonily-jame添加将其隐藏在类中)

  • 啊,好吧,所以你正在使用 xib。看起来发生的情况是,当您在设备上渲染时,xib 没有链接到 ViewController(但它在模拟器中 - 很奇怪)。您可以尝试 Clean 来尝试在两台设备上获得相同的行为。 (2认同)
  • @mbradber 很高兴我们能够弄清楚:) @ZonilyJame 感谢您的编辑,我喜欢在“UIViewController”中抽象它的想法 (2认同)