我想在iOS 13及以上版本上运行此代码,我应该如何修复此错误?我想让此代码也可以在iOS 13上运行。
@available(iOS 14.0, *)
@main
struct WeatherProApp: App {
@Environment(\.scenePhase) private var scenePhase
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup{
let fetcher = WeatherFetcher()
let viewModel = WeeklyWeatherViewModel(weatherFethcer: fetcher)
WeeklyWeatherView(viewModel: viewModel)
}
.onChange(of: scenePhase) { (newScenePhase) in
switch newScenePhase {
case .active:
print("scene is now active!")
case .inactive:
print("scene is now inactive!")
case .background:
print("scene is now in the background!")
@unknown default:
print("Apple must have added something new!")
}
}
}
}
但它显示了这个错误
6条答案
按热度按时间kxxlusnw1#
以下是我如何在iOS 13上运行我的项目:
1.创建SceneDelegate(如果没有)
SceneDelegate.swift
1.打开info.plist作为源代码,并添加以下行:
信息列表
1.将此添加到您的WeatherProApp.swift
WeatherProApp.swift
bnlyeluc2#
实际上,你可以在iOS 14之前的版本中使用
@main
属性,但你需要一个替代的AppDelegate
和SceneDelegate
(你可以从iOS 13 Xcode项目中复制这两个委托类),你必须做一些额外的 Package 。首先,你必须以下面的方式将
@main
属性应用于一个带有main
函数的结构体,该函数根据iOS版本决定是使用WeatherProApp
结构体还是AppDelegate
类来启动:之后,您可以使用您的问题中显示的实现,只需删除
@main
属性,仅使用@available(iOS 14.0, *)
。例如:我不知道你对UIKit有多熟悉,但你必须在SceneDelegate类中做同样的设置。
b91juud33#
这可能取决于其他项目代码,但下面的测试工作正常(Xcode 12b),所以可能会有帮助。
这个想法是将一个 Package 器隐藏在另一个带有可用性检查器的结构中:
iszxjhcz4#
如果你真的需要它,只需将@main更改为@UIApplicationMain,它应该会起作用。
cidc1ykv5#
结合@the.blaggy和@Ugo Marinelli的答案,我通过修改我的AppDelegate使其工作,而无需创建新的SceneDelegate:
我还像@the.blaggy一样 Package 了我的主结构体。
gk7wooem6#
来自@the.blaggy的答案真的很有帮助,非常感谢主要想法。我只是没有
AppDelegate
和SceneDelegate
从iOS 13 Xcode项目复制这两个委托类。我只需要使用相同的新SwiftUI视图来支持iOS 13+和macOS,而不是创建旧的UIKit和AppKit视图。AppDelegate
允许我们在Swift中直接使用configurationForConnecting
,而不是使用plist文件。@UIApplicationDelegateAdaptor
允许我们在iOS 14+上使用相同的AppDelegate
。我在一个文件中写了
MainAppWrapper
,MainApp
,AppDelegate
,SceneDelegate
。该文件可以用作任何SwiftUI项目的启动模板,以便在任何操作系统下运行相同的SwiftUI的
ContentView()
:iOS13、iOS14+、macOS。只需将整个
@main struct
替换到此代码中,您将在所有操作系统下看到相同的ContentView()
。