我需要支持 iOS 12 和 iOS 13。
我应该在AppDelegate
和之间复制代码SceneDelegate
吗?
例如:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
let window = UIWindow(windowScene: windowScene)
window.rootViewController = HomeViewController()
window.makeKeyAndVisible()
self.window = window
}
Run Code Online (Sandbox Code Playgroud)
和
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let window = UIWindow(frame: UIScreen.main.bounds)
window.rootViewController = HomeViewController()
window.makeKeyAndVisible()
self.window = window
return true
}
Run Code Online (Sandbox Code Playgroud)
如果我不这样做,在 1 个版本中我最终会出现黑屏,但是如果我这样做并以 的viewDidLoad
方法打印, …
我正在使用Xcode 11并为iOS 13构建应用程序。在Xcode中创建的新项目中,缺少一些UIApplicationDelegate方法,因此我将它们重新添加到了应用程序委托文件中。“单视图应用程序”项目的新模板缺少这些方法。问题在于,除了之外,没有其他任何委托方法被调用-application:didFinishLaunchingWithOptions:
。这是我的应用程序委托:
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"application:didFinishLaunchingWithOptions:");
return YES;
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"applicationDidEnterBackground:");
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSLog(@"applicationWillEnterForeground:");
}
#pragma mark - UISceneSession lifecycle
- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {
return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
}
- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions {
}
@end
Run Code Online (Sandbox Code Playgroud) 我正在升级应用程序以使用UIScene
iOS 13中定义的新模式,但是该应用程序的关键部分已停止工作。我一直在使用a UIWindow
来覆盖屏幕上的当前内容并向用户显示新信息,但是在我正在使用的当前Beta(iOS + XCode beta 3)中,该窗口会出现,但随后会立即消失。
这是我正在使用的代码,现在无法使用:
let window = UIWindow(frame: UIScreen.main.bounds)
let viewController = UIViewController()
viewController.view.backgroundColor = .clear
window.rootViewController = viewController
window.windowLevel = UIWindow.Level.statusBar + 1
window.makeKeyAndVisible()
viewController.present(self, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)
我已经尝试了许多方法,包括使用WindowScenes
来呈现新内容UIWindow
,但是找不到任何实际的文档或示例。
我的尝试之一(没有用-窗口出现并立即消失的相同行为)
let windowScene = UIApplication.shared.connectedScenes.first
if let windowScene = windowScene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
let viewController = UIViewController()
viewController.view.backgroundColor = .clear
window.rootViewController = viewController
window.windowLevel = UIWindow.Level.statusBar + 1
window.makeKeyAndVisible()
viewController.present(self, animated: true, completion: …
Run Code Online (Sandbox Code Playgroud) 在我们都习惯之前,AppDelegate
我们创建UIWindow
并rootViewController
为此设置的方法Window
。有时,当我们需要自定义警报时,我们可以创建一个新的警报UIWindow
。
现在 Xcode 会根据这个场景自动创建UIScene
和创建UIWindow
。我将不胜感激,如果有人能详细解释如何在现实生活中使用这个场景,什么是他们的主要受益于仅使用UIWindow
在AppDelegate
因为这篇文章没有解释太多
我在SceneDelegate中定义了一个let属性。我希望某些ViewController能够在场景中访问它。
在UIKit中,我可以访问App Delegate属性,如下所示:
UIApplication.shared.delegate
Run Code Online (Sandbox Code Playgroud)
然后强制转换并指定属性名称...
是否有等效的方法可以从UIViewController的实例获取对视图控制器所在的SceneDelegate的引用?
我有一个 SwiftUI/SpriteKit 项目。在一次充满错误的更改包标识符的任务中,我决定创建一个新项目并复制我的文件。
现在我已经有了这个包含所有旧文件的新项目,但是当我运行它时,我得到一个空白屏幕,因为我的SceneDelegate
函数scene(_:willConnectTo:options:)
没有被调用。
根据文档,SceneDelegate
如果您对info.plist
. 然而,我已经做了这些改变,但我的SceneDelegate
仍然不起作用。
这是我的相关部分SceneDelegate
:
import UIKit
import SwiftUI
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
static var mainData = MainData()
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 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现深层链接来导航到应用程序上的帖子,这是一个较旧的项目,所以我必须添加该类SceneDelegate
。仅当应用程序处于活动状态或在后台时,深层链接实现才有效。如果应用程序尚未加载,深层链接将不起作用。我看过很多关于此的帖子和教程,但没有找到原因,有人遇到过类似的问题吗?
在类中AppDelegate
,我添加了实现来处理以下函数的链接:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {}
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {}
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {}
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {}
Run Code Online (Sandbox Code Playgroud)
在SceneDelegate
我实现处理以下函数中的链接:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {}
func …
Run Code Online (Sandbox Code Playgroud) 我正在使用Xcode 11(beta3)并为iOS 13构建应用程序。在我的项目中,我创建了UIWindowSceneDelegate
在Info.plist中声明它的委托方法。现在,我可以创建多个窗口(和UIScene)。
现在我已经没有单个窗口了,如何访问rootViewController?我需要它来获取对它所持有的对象和范围的一些引用。
在我的AppDelegate window is nil
和ViewController(子视图控制器)实例中,我尝试使用,self.view.window.rootViewController
但发现这viewDidLoad()
还为时过早(我认为),并且该窗口仍为nil,可以在中工作viewDidAppear()
,但是我不需要每次都进行此过程视图控制器出现的时间。
这种处理应用程序场景的新方法的最佳实践是什么?
这是我的AppDelegate:
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
return true
}
func application(_ application: UIApplication,
configurationForConnecting connectingSceneSession: UISceneSession,
options: UIScene.ConnectionOptions) -> UISceneConfiguration {
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
Run Code Online (Sandbox Code Playgroud)
我的SceneDelegate:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// yes it's empty, I'm using storyboard
}
Run Code Online (Sandbox Code Playgroud) 我正在将适用于 iPadOS 的 iOS13 应用程序转换为 SceneDelegate(多窗口)。
如何从当前的 SceneDelegate 获取当前的 UIWindow?
我知道 a 可以使用UIView.window
or访问当前场景UIViewController.view.window
,但是我有一个非 UI 类(AppDelegate),我需要在其中获取窗口(iOS12 之前的 keyWindow)以在所有内容的顶部显示小吃吧。
我曾经这样做,[UIApplication sharedApplication].keyWindow
但现在,当然,这是错误的。
我一直在努力在我的应用程序中包含动态链接。我已经对其进行了设置,以便可以正确生成和接收链接,但它们仅在应用程序打开并在后台运行时才有效。如果应用程序完全关闭,则链接只会打开应用程序。看起来它没有调用 AppDelegate 中的 continueUserActivity 方法,即使我在 didFinishLaunchingWithOptions 方法中返回 TRUE。我已经读到我应该在 didFinishLaunchingWithOptions 方法中获取传入的 URL,但是可用的答案不起作用并且已经过时,所以我希望有人会知道。
这是代码:
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate{
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
FirebaseApp.configure()
return true
}
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
if let incomingURL = userActivity.webpageURL {
let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
guard error == nil else {
print(error!.localizedDescription) …
Run Code Online (Sandbox Code Playgroud) deep-linking firebase swift firebase-dynamic-links uiscenedelegate
uiscenedelegate ×10
swift ×7
ios ×5
ios13 ×4
appdelegate ×2
deep-linking ×2
uiscene ×2
xcode ×2
firebase ×1
info.plist ×1
iphone ×1
lifecycle ×1
swiftui ×1
uiwindow ×1
xcode11 ×1