let scene = UIApplication.shared.connectedScenes.first
if let sd: SceneDelegate = (scene?.delegate as? SceneDelegate) {
let window = sd.window
}
Run Code Online (Sandbox Code Playgroud)
这是 Swift 语言,我想将其转换为 Objective-C 语言。我已经尝试过这个:
UIScene *scene = [[[[UIApplication sharedApplication]connectedScenes]allObjects]firstObject];
Run Code Online (Sandbox Code Playgroud)
但现在没有了SceneDelegate
;在 Objective-C 中,有 UIKit 的UIWindowSceneDelegate
.
我也无法访问 UIScenedelegate。Scenedelegate 在 Swift 中,我试图在 Objective-C 中获取窗口,但现在我无法在 swiftUI 中访问窗口。
我正在我的应用程序中实现 URL 方案,当应用程序位于前台或后台时,它们总体工作正常。但是,我注意到,当它完全关闭并且另一个应用程序尝试使用我的 URL(例如app:page?image=1
)访问通常可以工作的内容时,它只会打开该应用程序,但内容永远不会被捕获。
我已经在 AppDelegate 和 SceneDelegate 方法中设置了代码
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:])
Run Code Online (Sandbox Code Playgroud)
和
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
Run Code Online (Sandbox Code Playgroud)
当应用程序处于后台、前台或关闭时它会打开
它仅在前台或后台时打开
当在 iOS 13+ 中使用 SwiftUI 时,确定后台状态的传统方法不再起作用。例如:
AppDelegate 方法applicationDidEnterBackground(_ application: UIApplication)
不会applicationDidBecomeActive(_ application: UIApplication)
被调用。
不会发送通知didEnterBackgroundNotification
、willEnterForegroundNotification
和didBecomeActiveNotification
。willResignActiveNotification
作为替代方案,有UIWindowSceneDelegate
回调:sceneDidBecomeActive(_ scene: UIScene)
, sceneWillResignActive(_ scene: UIScene)
, sceneWillEnterForeground(_ scene: UIScene)
,sceneDidEnterBackground(_ scene: UIScene)
这些替换的问题在于它们特定于进入和离开前台的多个场景之一。它们没有提供一种简单干净的方法来确定整个应用程序是在前台还是后台。
确定应用程序前台/后台状态很重要,其原因与用户界面无关。 当应用程序不在前台时,某些 iOS 功能会默默地失败(通配符蓝牙扫描和 iBeacon 传输是两个例子。)我经常开发没有任何用户界面的 iOS 框架,因此我需要一种方法来确定应用程序后台/前台状态不依赖于在中粘贴一堆样板代码UIWindowSceneDelegate
——对我来说,要求某人使用我的框架来做到这一点是不合理的。
是否有任何简单的方法可以使用 SwiftUI 确定 iOS 13 上应用程序的前台/后台状态?
nsnotificationcenter appdelegate ios13 swiftui uiscenedelegate
苹果开发人员文档提到,一个场景的多个实例在iOS 13上可用(即iPhone和iPad)
从他们的开发人员文档中:
在iOS 13及更高版本中,用户可以同时创建和管理应用程序用户界面的多个实例,并使用应用程序切换器在它们之间进行切换。在iPad上,用户还可以并排显示您的应用程序的多个实例。UI的每个实例显示不同的内容,或以不同的方式显示相同的内容。例如,用户可以显示显示特定日期的“日历”应用程序的一个实例,显示整个月的另一个实例。
我已经在iPadOS上进行了尝试,并且能够使用他们在WWDC视频中提到的手势和UI动作来创建多个场景实例,但是我没有找到有关如何在iPhone上实现该功能的参考,了解如何实现这一目标或是否可能实现。
如果我有一个 SwiftUI 视图,并将其放入后台(即在 iPhone 上按一次主页按钮),然后再次重新打开它,我想触发一些操作。
我的第一个想法是利用
.onAppear{}
Run Code Online (Sandbox Code Playgroud)
修饰符,但是,经过一些测试,这不适用于在后台后进入前台的视图。
似乎没有与 UIKit ViewWillAppear 等效的 SwiftUI。
我在想也许场景委托在这里有用,因为它确实提供了以下功能:
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.
}
Run Code Online (Sandbox Code Playgroud)
但我不确定是否有一种有效的方法来使用此函数在视图从后台进入前台时触发视图中的操作。
任何对此的想法将不胜感激。
这是我的简单按钮操作,用于显示 XIB 文件,该文件实际上是 Objective-C 中的条形码扫描仪。
- (IBAction)startCamera:(id)sender {
BarcodeVC * controller = [[BarcodeVC alloc] initWithNibName:@"BarcodeVC" bundle:[NSBundle mainBundle]];
//[self presentViewController:controller animated:YES completion:nil];
UIWindow * currentwindow = [[UIApplication sharedApplication] keyWindow];
[currentwindow.rootViewController presentViewController:controller animated:YES completion:nil];
}
Run Code Online (Sandbox Code Playgroud)
但不幸的是,一个警告来了:
keyWindow
已弃用:首先在 iOS 13.0 中弃用
我知道iOS 13支持多场景,但是Objective-C有没有办法解决这个问题?我见过 Swift 版本,但使用 Objective-C 却没有成功。
当我使用 Xcode 14 启动新项目时,我无法将界面从 SwiftUI 更改为 Storyboard。
我在哪里可以创建一个使用 Storyboard 而不是 SwiftUI 的新项目?
ios ×5
swiftui ×4
ios13 ×3
swift ×3
appdelegate ×2
objective-c ×2
storyboard ×1
uiwindow ×1
url-scheme ×1
xcode14 ×1