當部署目標為 15.2 時,應用程式運行良好,但后來我需要將部署目標更改為 iOS 13 以支持更多設備。Thread 1: signal SIGABRT在 iOS 14 上仍然可以正常作業,但是當它在模擬器上的 iOS 13 上運行時會崩潰并出現例外。控制臺不顯示除錯資訊:
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檔案的截圖,專門擴展了相關區域:

uj5u.com熱心網友回復:
可StateObject從 SwiftUI 2.0 (iOS 14) 獲得,旨在在 View 中作業,而不是在類中作業(如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
uj5u.com熱心網友回復:
根據Apple 檔案,StateObject僅適用于 iOS 14 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/473512.html
