Ich erhalte derzeit einen leeren Bildschirm mit Xcode 11, Target iOS 13.0 (die App funktioniert einwandfrei mit allen unten aufgeführten Versionen iOS 12.1 bis 12.4). Ich möchte, dass meine App sowohl für iOS-Benutzer über 12.1 als auch für 13.0 funktioniert, obwohl derzeit ein leerer Bildschirm angezeigt wird Hinzufügen des folgenden SceneDelegate zu meinem bestehenden Projekt und
Hinzufügen einer App Manifest-Datei
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 }
}
}
}
Das Folgende ist mein AppDelegate, das zuerst aufgerufen wird und die didFinishLaunchWithOptions
Methode ausführt . Ich möchte wissen, wie ich diese Methode nur aufrufen kann, wenn mein Ziel-iOS kleiner als 13.0 ist, und die SceneDelegate-Methode aufrufen kann, um meinen rootViewController nach 13.0 zu initialisieren.
@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
Szenendelegatmethode und gehen Sie Schritt für Schritt vor. Tut es das, was Sie erwarten?willConnectTo
gerufen? Was passiert dann? Ist es sinnvoll, den Root-View-Controller zu erstellen und festzulegen? Gehen Sie den Code erneut mit dem Debugger durch. Verlassen Sie sich nicht nur auf die Konsolenausgabe.Also Schritte zu einer iOS 13 und niedrigeren Version
1) Ändern Sie das Bereitstellungsziel in iOS 12.
2) Ersetzen Sie die Methoden von AppDelegate durch die Methoden, die sie für die Entwicklung von iOS 12 benötigen. Fügen Sie auch Folgendes hinzu:
3) Entfernen Sie SceneDelegate.
4) Entfernen Sie das Anwendungsszenenmanifest in Ihrer info.plist.
Es funktioniert sowohl mit iOS 13 als auch mit einer niedrigeren iOS-Version
quelle
Ich war mit diesem Problem festgefahren und schließlich löste ich das Entfernen der searchDisplayController-Referenzen aus dem Storyboard.
quelle
Wenn ich ein ähnliches Problem hatte, lag es daran, dass die mit Xcode 11.0 generierte Single-App-Vorlage nicht mit der für eine mit Xcode 11.2 erstellte App benötigten Vorlage kompatibel war.
Also habe ich gerade eine neue Single-Page-App mit Xcode 11.2 erstellt und das generierte SceneDelegate in mein altes Projekt kopiert, das mit Xcode 11.0 erstellt wurde.
Danach war der leere Bildschirm verschwunden und meine Benutzeroberfläche wieder sichtbar.
quelle
Brach diese Schritte leicht
1-) Entfernen Sie die Szenendelegatdatei
2-) Fügen Sie den folgenden Code zu AppDelegate.swift hinzu
3-) Entfernen Sie die Zeile Application Scene Manifest aus Ihrer .plist-Datei
quelle