Черный, когда экран при программной настройке начального контроллера

Не могли бы вы взглянуть на репозиторий https://github.com/Rukomoynikov/InitialViewControllerProgrammatically и помочь мне. Почему у меня черный экран при попытке создания экземпляраViewController.

Это мой AppDelegate:

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        window = UIWindow.init(frame: UIScreen.main.bounds)

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let viewController = storyboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
        guard window != nil else { return true }
        self.window!.backgroundColor = .darkGray
        self.window!.rootViewController = viewController
        self.window!.makeKeyAndVisible()

        return true
    }
}

Пара деталей.

  1. Приложение создано в последней версии Xcode.
  2. Цель развертывания iOS изменена с 13 на 12.
  3. SceneDelegate удален.
  4. В целевых настройках опция Main Interface отключена.
  5. В info.plist StoryBoardName и DelegateClassName также удалены.

person Maksim Rukomoynikov    schedule 08.11.2019    source источник


Ответы (2)


Проблема в том, что, пытаясь заставить проект прекратить использование делегата сцены и вместо этого использовать делегат приложения, вы исказили запись UIApplicationSceneManifest в Info.plist. Вместо этого вам нужно будет удалить эту запись полностью. Простое его присутствие - это то, что заставляет использовать архитектуру делегата сцены.

Однако было бы лучше сделать эту работу как для iOS 12 с использованием делегата приложения, так и для iOS 13 с использованием делегата сцены (как я описал в https://stackoverflow.com/a/58405507/341994).

person matt    schedule 09.11.2019

iOS 13 переместила настройку Windows из AppDeleagte в SceneDelegate для поддержки использования (возможно, нескольких) сцен, а не одного окна. Теперь вам нужно выполнить настройку следующим образом:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

   var window: UIWindow?
   let storyboard = UIStoryboard(name: "Main", bundle: nil)

   func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
      guard let windowScene = scene as? UIWindowScene else { return }
      let vc = storyboard.instantiateViewController (withIdentifier: "Primary") as! ViewController
      window = UIWindow(windowScene: windowScene)
      window?.rootViewController = vc
      window?.makeKeyAndVisible()
   }
}
person flanker    schedule 08.11.2019
comment
Спасибо за упоминание. Но я удалил SceneDelegate, потому что хотел бы поддерживать iOS с 12. - person Maksim Rukomoynikov; 08.11.2019
comment
@MaksimRukomoynikov Нет, вы не удаляли. Это прямо в вашем проекте на github; вы также нарушили проект, изменив info.plist. - person matt; 08.11.2019
comment
@matt Спасибо. Но это просто ссылка (я удалил ее также из файлов в новом коммите) - person Maksim Rukomoynikov; 08.11.2019
comment
Но теперь в этом вся проблема. Вы нарушили запись UIApplicationSceneManifest. Вам нужно будет удалить его полностью. - person matt; 09.11.2019
comment
@matt О, спасибо большое. Я удалил (Application Scene Manifest) из info.plist, и он начал работать, как ожидалось. Спасибо. - person Maksim Rukomoynikov; 09.11.2019
comment
Я дам это как ответ. - person matt; 09.11.2019