Je reçois actuellement un écran vide avec Xcode 11, Target iOS 13.0 (l'application fonctionne bien avec toutes les versions ci-dessous iOS 12.1 à 12.4), je veux faire fonctionner mon application pour les utilisateurs iOS supérieurs à 12.1 et aussi 13.0 obtenir actuellement un écran vide malgré ajouter le SceneDelegate ci-dessous à mon projet existant et
ajout d'un fichier manifeste d'application
import UIKit
import SwiftUI
@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
//guard let _ = (scene as? UIWindowScene) else { return }
let user = UserDefaults.standard.object(forKey: "defaultsuserid")
let userSelfIdent = UserDefaults.standard.object(forKey: "userinitialident")
if let windowScene = scene as? UIWindowScene {
let internalWindow = UIWindow(windowScene: windowScene)
if (user != nil && userSelfIdent != nil){
let mainstoryboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewcontroller:UIViewController = mainstoryboard.instantiateViewController(withIdentifier: "swrevealviewcontroller") as! SWRevealViewController
internalWindow.rootViewController = newViewcontroller
self.window = internalWindow
internalWindow.makeKeyAndVisible()
}else {
guard let _ = (scene as? UIWindowScene) else { return }
}
}
}
Ce qui suit est mon AppDelegate qui est appelé en premier et exécute la didFinishLaunchWithOptions
méthode. Je veux savoir comment puis-je effectuer cet appel de méthode uniquement si mon ios cible est inférieur à 13.0 et appeler la méthode SceneDelegate pour initialiser mon rootViewController après 13.0?
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
@available(iOS 13.0, *)
func application(_ application: UIApplication,
configurationForConnecting connectingSceneSession: UISceneSession,
options: UIScene.ConnectionOptions) -> UISceneConfiguration {
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
@available(iOS 13.0, *)
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
}
@available(iOS 13.0, *)
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let _ = (scene as? UIWindowScene) else { return }
if (user != nil && userSelfIdent != nil){
let mainstoryboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewcontroller:UIViewController = mainstoryboard.instantiateViewController(withIdentifier: "swrevealviewcontroller") as! SWRevealViewController
self.window?.rootViewController = newViewcontroller
}
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
Thread.sleep(forTimeInterval: 3.0)
UINavigationBar.appearance().barTintColor = UIColor(red:0.08, green:0.23, blue:0.62, alpha:1.0)
if (user != nil && userSelfIdent != nil){
let mainstoryboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewcontroller:UIViewController = mainstoryboard.instantiateViewController(withIdentifier: "swrevealviewcontroller") as! SWRevealViewController
self.window?.rootViewController = newViewcontroller
}
return true
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let defaultUserID = UserDefaults.standard.string(forKey: "defaultUserID")
}
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
switch (application.applicationState) {
case UIApplicationState.active:
do something
case UIApplicationState.background, UIApplicationState.inactive:
let mainstoryboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewcontroller = mainstoryboard.instantiateViewController(withIdentifier: "swrevealviewcontroller") as! SWRevealViewController
self.window?.rootViewController = newViewcontroller
}
}
willConnectTo
méthode de délégué de scène et continuez pas à pas. Fait-il ce que vous attendez?willConnectTo
appelé? Que se passe-t-il alors? At-il le point de créer et de configurer le contrôleur de vue racine? Encore une fois, parcourez le code avec le débogueur. Ne vous fiez pas seulement à la sortie de la console.Donc, étapes pour accéder à une version iOS 13 et inférieure
1) Changez la cible de déploiement en iOS 12.
2) Remplacez les méthodes d'AppDelegate par ce qu'elles devraient avoir pour le développement d'iOS 12. Ajoutez également ceci:
3) Supprimez SceneDelegate.
4) Supprimez le manifeste de scène d'application dans votre info.plist.
Cela fonctionnera sur iOS 13 et la version iOS inférieure
la source
J'étais coincé avec ce problème, et finalement j'ai résolu de supprimer les références searchDisplayController du storyboard.
la source
Lorsque j'ai eu un problème similaire, cela était dû au fait que le modèle d'application unique généré à l'aide de Xcode 11.0 était incompatible avec celui nécessaire pour une application construite avec Xcode 11.2.
J'ai donc créé une nouvelle application de page unique avec Xcode 11.2 et copié le SceneDelegate généré dans mon ancien projet qui a été créé à l'aide de Xcode 11.0.
Après cela, l'écran vide avait disparu et mon interface était à nouveau visible.
la source
Suivez facilement ces étapes
1-) Supprimer le fichier délégué de scène
2-) Ajoutez le code ci-dessous à AppDelegate.swift
3-) Supprimez la ligne du manifeste de la scène d'application de votre fichier .plist
la source