【问题标题】:iOS - Setting 'rootViewController' results in black screen on device onlyiOS - 设置“rootViewController”仅在设备上导致黑屏
【发布时间】:2017-04-17 05:45:59
【问题描述】:

对于一个非常基本的单视图应用程序,我删除了主情节提要文件并删除了对它的所有引用。因此,我正在以编程方式设置窗口 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
    }

我已经从 info.plist 文件中删除了 Main storyboard 条目,以及常规设置中的“Main Interface”条目。

我正在使用 Swift 3 并针对 iOS 8 设备。我正在使用 XCode 8.3.1。

控制台没有输出,也没有异常。 viewDidLoad 函数甚至在断点处触发,因此代码路径似乎运行正常。

有什么想法吗?

根据要求,这是 DummyViewController 的基本代码。

class DummyViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

显示未参考主界面的常规设置

这是链接到 DummyViewController 的 .xib 的图像

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

【问题讨论】:

标签: ios swift


【解决方案1】:

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

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


从 XIB 加载 UIViewController

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

或者,您可以通过在 MyViewController 中添加自定义初始化来屏蔽加载:

class MyViewController: UIViewController {
    required init() {
        super.init(nibName: "xibname", bundle: nil)
    }
}

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

【讨论】:

  • @mbradber 通用设置中对主界面的引用删除了吗?
  • @mbradber 看起来您的 ViewController 没有设置为显示任何内容,因此预计会出现黑屏。请参阅我的更新答案。背景会变红吗?
  • 这确实有效,我看到了红色背景。但是,我有一个带有标签和蓝色背景的 DummyViewController.xib,它没有在设备上呈现,就好像原始 .xib 只是被忽略了一样。在模拟器上,.xib 加载并正确显示。
  • 啊,好吧,所以你使用的是 xib。看起来正在发生的事情是当您在设备上渲染时 xib 没有链接到 ViewController(但它在模拟器中 - 很奇怪)。您可以尝试 Clean 以尝试在两台设备上获得相同的行为。
  • @mbradber 很高兴我们能够弄清楚 :) @ZonilyJame 感谢您的编辑,我喜欢在 UIViewController 中抽象它的想法
【解决方案2】:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

         let mainStoryboardIpad : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
         let loginView : BaseClassVC = mainStoryboardIpad.instantiateViewControllerWithIdentifier("BaseClassVC") as BaseClassVC
            let navigationController = UINavigationController(rootViewController: loginView)

         self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
         self.window?.rootViewController = navigationController
         self.window?.makeKeyAndVisible()

         return true
    }

【讨论】:

  • 这会导致异常,因为我已经从项目中删除了主捆绑包。最好我不需要保留这个文件,因为我不会使用它。
【解决方案3】:

将您的窗口根更改为并设置颜色

let viewController:DummyViewController = DummyViewController()
self.window?.backgroundColor = UIColor.white
self.window?.rootViewController = viewController

然后更换你的控制器

  override func viewDidLoad() {
    self.view.backgroundColor = UIColor.white
  }

【讨论】:

    【解决方案4】:

    您只需要初始化 viewcontroller 对象并为其实例实现白色背景色。

    var window: UIWindow?
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
        window = UIWindow(frame: UIScreen.main.bounds)
        //Add below 2 lines
        let vc = DummyViewController()
        vc.view.backgroundColor = .white
    
        window?.rootViewController = vc
        window?.makeKeyAndVisible()
        return true
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 2014-06-21
      • 2018-03-21
      • 2020-01-24
      • 2018-08-29
      • 2012-11-08
      • 2015-10-30
      相关资源
      最近更新 更多