Перенос старого проекта Xcode в новый с помощью UISceneDelegate
У меня старый проект Xcode без UISceneDelegate
методов. Можно ли перенести старый проект Xcode на новый с помощью UISceneDelegate
методов, НО все еще сохраняя совместимость с iOS 12?
Если да, то как? Потому что я вижу много ошибок в iOS 14, для которых единственный обходной путь - использование методов UISceneDelegate.
Ответы
РЕДАКТИРОВАТЬ 1:
Убедитесь, что вы запрашиваете windowOrientation
после рендеринга представления View Controller. Как правило , в viewDidLoad()
и viewWillAppear(_:)
, view.window
как nil
проверить этот ответ . Просто проверьте значение windowOrientation
in viewDidAppear(_:)
.
Если у вас есть проблемы с доступом к этому значению даже до того, как попробуйте следующее определение
private var windowOrientation: UIInterfaceOrientation {
if #available(iOS 13.0, *) {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation ?? .unknown
} else {
// Fallback on earlier versions
return UIApplication.shared.statusBarOrientation
}
}
Я не уверен, использует ли ваше приложение несколько окон или нет, но если есть только одно (поскольку вы не создаете какое-либо окно программно), следующее определение должно работать нормально.
var hasTopNotch: Bool {
return UIApplication.shared.windows.first?.safeAreaInsets.top ?? 0 > 20
}
Оригинальный ответ:
UISceneDelegate
был введен iOS 13.0
таким образом, чтобы не быть совместимым iOS 12
, вам нужно UIApplicationDelegate
полностью полагаться на . Для поддержки UISceneDelegate
for iOS 13.x
необходимо добавить явную проверку доступности, чтобы избежать ошибки компиляции.
Шаги 1. Добавьте манифест сцены в Info.plist
Откройте Info.plist
как Source Code
и добавьте следующее
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
</dict>
Шаг 2. Создайте SceneDelegate.swift
файл со следующим содержанием
import UIKit
@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
guard let _ = (scene as? UIWindowScene) else { return }
}
func sceneDidDisconnect(_ scene: UIScene) {
// Called as the scene is being released by the system.
// This occurs shortly after the scene enters the background, or when its session is discarded.
// Release any resources associated with this scene that can be re-created the next time the scene connects.
// The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
}
func sceneDidBecomeActive(_ scene: UIScene) {
// Called when the scene has moved from an inactive state to an active state.
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
}
func sceneWillResignActive(_ scene: UIScene) {
// Called when the scene will move from an active state to an inactive state.
// This may occur due to temporary interruptions (ex. an incoming phone call).
}
func sceneWillEnterForeground(_ scene: UIScene) {
// Called as the scene transitions from the background to the foreground.
// Use this method to undo the changes made on entering the background.
}
func sceneDidEnterBackground(_ scene: UIScene) {
// Called as the scene transitions from the foreground to the background.
// Use this method to save data, release shared resources, and store enough scene-specific state information
// to restore the scene back to its current state.
}
}
Шаг 3. Обновите AppDelegate
- Добавьте
UISceneSession Lifecycle
методы.
// MARK: UISceneSession Lifecycle
@available(iOS 13.0, *)
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
@available(iOS 13.0, *)
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
ii) Наконец, обратитесь к документации Apple . Вы можете обратиться кhttps://dev.to/kevinmaarek/add-a-scene-delegate-to-your-current-project-5on для дополнительных задач по очистке и настройке.