Приложение Swift Storyboard запускается на черном экране

#ios #swift #xcode #storyboard #uikit

#iOS #swift #xcode #раскадровка #uikit

Вопрос:

Всем привет,

Я создаю приложение Swift с использованием раскадровок. Я нормально работаю уже несколько месяцев, но внезапно мое приложение не загружается должным образом. Всякий раз, когда я открываю его на симуляторе или на своем физическом iPhone, экран запуска отображается до появления черного экрана.

Мой Mac находится на macOS Big Sur Developer Beta 5 с Xcode 12 Beta 6, а мой iPhone — на iOS 14 Developer Beta 5.

Это произошло внезапно, и я не помню, чтобы что-то делал, чтобы вызвать это.

Вот что я пробовал до сих пор…

  • Переименование раскадровки и обновление вкладки «Общие» целевого объекта на новое имя, а также выполнение того же самого, но редактирование вручную Info.plist
  • Перемещение раскадровки в «Копировать ресурсы пакета» и из него.
  • Обновление до последней бета-версии Xcode 12 (я на macOS Big Sur)
  • Очистка производных данных с помощью DevCleaner
  • Запускаю совершенно новый проект и переношу весь свой код и ресурсы с помощью перетаскивания (Интересное наблюдение: когда я запускал новый проект, я добавил простую метку к Main.storyboard по умолчанию и запустил его на своем iPhone. Метка не отображалась.)
  • Добавление функции в my AppDelegate для загрузки раскадровки вручную при запуске
  • Добавление различных инструкций печати в AppDelegate и my Home View Controller

AppDelegate

Я добавил

 let storyboard = UIStoryboard(name: "Main", bundle: nil)
let initialViewController = storyboard.instantiateViewController(withIdentifier: "Home")
self.window.rootViewController = initialViewController
self.window.makeKeyAndVisible()
print("App launched")
  

в мой AppDelegate. Теперь, когда я запускаю свое приложение, я получаю
напечатано. Я также добавил

 override func viewDidLoad() {
    super.viewDidLoad()
    print("Home view loaded")
  

к моему контроллеру домашнего просмотра.
Теперь, когда я запускаю свое приложение, я печатаю это в Xcode:

 2020-08-28 13:11:20.140963 0100 MY-APP[11077:1951343] libMobileGestalt MobileGestaltCache.c:166: Cache loaded with 4536 pre-cached in CacheData and 53 items in CacheExtra.

2020-08-28 13:11:20.759943 0100 MY-APP[11077:1951162] Metal API Validation Enabled

Home view loaded

App launched
  

Тем не менее, на моем iPhone ничего нет. Появляется экран запуска, становится черным, и все. Я так запутался.

Если кто-нибудь знает, как это исправить, или что-то, что я могу попробовать, пожалуйста, дайте мне знать. Заранее благодарю вас!

Комментарии:

1. Удалось ли вам решить эту проблему?

2. @AshleyMills Вы, ребята, смогли найти решение этой проблемы?

3. Вы нашли какое-либо решение? Я также сталкиваюсь с той же проблемой.

Ответ №1:

Убедитесь, что подобное окно присутствует как в вашем sceneDelegate, так и в AppDelegate.

 class AppDelegate: UIResponder, UIApplicationDelegate {
    
// check for this

    var window: UIWindow?

// check for this

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

    }

}
  

Ответ №2:

Если вы пока не хотите переключаться на Scene API, вы также можете просто установить UIApplicationSupportsMultipleScenes значение NO в UIApplicationSceneManifest разделе, который, вероятно, недавно появился в вашем Info.plist. Это то, что я только что сделал, и это устранило проблему для меня.

Ответ №3:

В последней версии свойство window больше не доступно в AppDelegate. Теперь оно перемещено в SceneDelegate.swift . Вы можете попробовать сделать, как показано ниже, в функции scene willConnectTo:

 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let _ = (scene as? UIWindowScene) else { return }
    if let windowScene = scene as? UIWindowScene {
        self.window = UIWindow(windowScene: windowScene)
        let storyBoard = UIStoryboard(name: "Main", bundle: nil)
        let initialViewController = storyBoard.instantiateViewController(withIdentifier: "Home")
        self.window?.rootViewController = initialViewController
        self.window!.makeKeyAndVisible()
    }
}
  

Обновление: также сделайте ваш основной интерфейс в разделе «Общее меню» пустым

введите описание изображения здесь

Также вам необходимо удалить <key>UIMainStoryboardFile</key><string>Main</string> и <key>UISceneStoryboardFile</key> <string>Main</string> из вашего Info.plist вашего проекта.

Комментарии:

1. Хммм, это ничего не дало… приложение по-прежнему запускается на черном экране.

2. Тогда может возникнуть другая проблема. Мы не можем видеть детали вашей раскадровки, как она организована. Однако, является ли основной интерфейс в целом пустым?

3. Нет, в главном интерфейсе выбран Main.storyboard. Я играл с этим, но все еще безуспешно… спасибо за вашу помощь.

4. Также вам необходимо удалить <key>UIMainStoryboardFile</key><string>Main</string> и <key>UISceneStoryboardFile</key> <string>Main</string> из вашего Info.plist вашего проекта.

Ответ №4:

Я также столкнулся с той же проблемой. В исходном вопросе говорится,
«Это произошло внезапно, и я не помню, чтобы что-то делал, чтобы вызвать это».

Это именно то, что случилось со мной, и ниже показано, как я решил проблему.

В Main.storyboard есть точка входа в приложение, которая визуально изображена в виде стрелки, указывающей на навигационный контроллер. Раз вопрос появился, я заметил, что эта стрелка как-то сейчас не хватает, и это начальный вид контроллера флажок в представлении контроллера разделе атрибут инспектора на вкладке инспектора области сейчас снят.

Проблема была решена, когда я установил упомянутый выше флажок Is Initial View Controller (стрелка в контроллере навигации раскадровки также появилась после проверки этого). Ниже приведено изображение xcode после решения проблемы, чтобы помочь лучше понять.
Это изображение, показывающее панель контроллера навигации и инспекторов после устранения проблемы.

Надеюсь, кто-нибудь найдет это полезным.