Ошибка в приложении-делегате при попытке запуска на посадке - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь создать экран для моего приложения iOS с использованием бумаги, что хорошо работает, но у меня проблема с app delegate и раскадровкой.

При запуске приложения возникает ошибка:

Не удалось создать экземпляр контроллера представления по умолчанию для UIMainStoryboardFile 'Main' - возможно, назначенная точка входа не установлена?

Симулятор показывает черный экран. Значит ли это, что контроллер вида root не установлен? В раскадровках я не установил начальный контроллер представления, но когда я попытался установить встроенный экран в качестве начального контроллера представления, приложение работало, предполагая, что нет никаких ошибок во встроенном контроллере представления.

Вот AppDeleagte. Кроме того, я убедился, что идентификаторы раскадровки верны.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

  window = UIWindow(frame: UIScreen.main.bounds)

  let sb = UIStoryboard(name: "Main", bundle: nil)

  var initialVC = UIStoryboard(name: "Main", bundle:nil).instantiateViewController(withIdentifier: "Onboarding") as UIViewController

  let userDefaults = UserDefaults.standard

  if userDefaults.bool(forKey: "onboardingComplete") {
    initialVC = UIStoryboard(name: "Main", bundle:nil).instantiateViewController(withIdentifier: "Mainapp") as UIViewController
  }

  self.window!.rootViewController = initialVC
}

Ответы [ 3 ]

0 голосов
/ 08 апреля 2020

Этот код работает для меня:

let onboardingVC = "get your onboarding VC here"

window = UIWindow(frame: UIScreen.main.bounds)
window.rootViewController = onboardingVC
window.makeKeyAndVisible()

Надеюсь, это поможет вам. Прокомментируйте, если у вас возникнут какие-либо проблемы. Рад помочь!

0 голосов
/ 08 апреля 2020

Похоже, вы пропустили "вернуть истину" в конце

     var window: UIWindow?

       func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

          window = UIWindow(frame: UIScreen.main.bounds)
          let sb = UIStoryboard(name: "Main", bundle: nil)
          var initialVC = sb.instantiateViewController(withIdentifier: "Onboarding") as UIViewController
          let userDefaults = UserDefaults.standard
          if userDefaults.bool(forKey: "onboardingComplete") {
            initialVC = sb.instantiateViewController(withIdentifier: "Mainapp") as UIViewController
          }
          self.window?.rootViewController = initialVC
          return true
        }

ОБНОВЛЕНИЕ:

Я недавно создал новый проект и, похоже, столкнулся с вашей проблемой из-за невозможности Загрузите ViewController программно через AppDelegate.

Вот что у меня сработало. Начиная с IOS 13 и SwiftUI, Apple представила новый файл под названием «SceneDelegate.swift» для поддержки функций SwiftUI,

Так что вам не нужно ничего устанавливать в «AppDelegate.swift», вместо этого сделайте это в «SceneDelegate» .swift "

Уже есть свойство для окна.

var window: UIWindow?

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
   let yourVCToView = UIStoryboard.storyboardWith....()
   window?.rootViewController = yourVCToView
   guard let _ = (scene as? UIWindowScene) else { return }
}
0 голосов
/ 08 апреля 2020

Здесь есть две проблемы.

Во-первых, вы не установили UIWindow в качестве ключа и видимого элемента. Итак, добавьте эту строку кода после того, как вы установите rootViewController:

window?.makeKeyAndVisible()

. На этом этапе ваш код будет работать, но упомянутая ошибка, вероятно, все равно будет выводиться на консоль при запуске app.

Когда вы создаете проект, XCode настраивает его так, чтобы раскадровка Main загружалась автоматически (с отображением контроллера начального вида).

Итак, даже если вы настраиваете сами по себе window программно, ваше приложение все еще пытается запустить контроллер начального представления в главном файле раскадровки, как об этом говорят настройки проекта.

Чтобы остановить его от пытаясь сделать это, откройте «Общие» настройки цели вашего приложения, очистите содержимое текстового поля «Основной интерфейс» и нажмите «Return», чтобы сохранить изменения.

Это обновит ваш проект info.plist, удаление ключа / значения Main storyboard file base name, которое вызывает автоматическое поведение c при запуске приложения.

Снимок экрана ниже:

Update the Main interface in your target's general settings

...