当部署目标为15.2时,App运行良好,但随后我需要将部署目标更改为iOS 13,以支持更多设备。在iOS 14+上仍然可以正常工作,但是当它在模拟器上运行在iOS 13上时,它会与异常Thread 1: signal SIGABRT一起崩溃。控制台不显示调试信息:
CoreSimulator 802.6 - Device: iPhone 11 (iOS 13.0) (6CCC2B89-002B-4E83-8175-C244984BFC46) - Runtime: iOS 13.0 (17A577) - DeviceType: iPhone 11
Message from debugger: Terminated due to signal 9下面是WeatherApp.swift文件代码的相关片段以及错误的屏幕截图:
@main
struct WeatherAppWrapper {
static func main() {
if #available(iOS 14.0, *) {
WeatherApp.main()
}
else {
UIApplicationMain(CommandLine.argc, CommandLine.unsafeArgv, nil, NSStringFromClass(SceneDelegate.self))
}
}
}struct WeatherApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
@StateObject var loginStatus = UserLoginStatus()
@available(iOS 14.0, *)
var body: some Scene {
WindowGroup {
NavigationView{
if Methods.UserAccount.getFromUserDefaults()["username"] != nil {
MainView(loggedIn: $loginStatus.loggedIn)
LoginView(username: "", password: "", loggedIn: $loginStatus.loggedIn)
} else {
LoginView(username: "", password: "", loggedIn: $loginStatus.loggedIn)
MainView(loggedIn: $loginStatus.loggedIn)
}
}
}
}
class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
//Some app-specific setup code
...
return true
}
}
}class UserLoginStatus: ObservableObject {
@Published var loggedIn: Bool {
didSet {
print("The value of loggedIn changed from \(oldValue) to \(loggedIn)")
}
}
init () {
loggedIn = false
}
}
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
@StateObject var loginStatus = UserLoginStatus()
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
let mainView = MainView(loggedIn: $loginStatus.loggedIn)
let loginView = LoginView(username: "", password: "", loggedIn: $loginStatus.loggedIn)
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
if Methods.UserAccount.getFromUserDefaults()["username"] != nil {
window.rootViewController = UIHostingController(rootView: mainView)
} else {
window.rootViewController = UIHostingController(rootView: loginView)
}
self.window = window
window.makeKeyAndVisible()
}
}
}

另外,下面是Info.plist文件的屏幕截图,特别是扩展了相关区域:

发布于 2022-05-13 04:55:12
StateObject可以从SwiftUI 2.0 (iOS 14)中获得,并且设计成在视图中工作,而不是在类中工作(比如SceneDelegate)
对于所提供的场景,可能的解决方案是在顶层(委托或主视图中)使用logicState作为只是属性,但将其完全注入子视图(而不是仅仅绑定),并在内部观察它。
所以看起来应该是
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var loginStatus = UserLoginStatus() // << just hold here
// ...
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
let mainView = MainView(loginStatus: loginStatus) // << here !!和
struct MainView: View {
@ObservedObject var loginStatus: UserLoginStatus // << injected here
// ...
}在WeatherApp中也可以这样做
发布于 2022-05-13 04:36:23
根据苹果文档的说法,StateObject只能在iOS 14+上使用。
https://stackoverflow.com/questions/72224245
复制相似问题