我想使用 SwiftUI 构建一个非常简单的 iOS 14 侧边栏。该设置是相当简单,我有三个观点HomeView,LibraryView与SettingsView和枚举代表每个屏幕。
enum Screen: Hashable {
case home, library, settings
}
Run Code Online (Sandbox Code Playgroud)
我的最终目标是根据大小类在选项卡视图和侧边栏之间自动切换,但有些事情并没有按预期工作。
全局状态由 拥有MainNavigationView,它也是 my 的根视图WindowGroup。
struct MainNavigationView: View {
@State var screen: Screen? = .home
var body: some View {
NavigationView {
SidebarView(state: $screen)
}
.navigationViewStyle(DoubleColumnNavigationViewStyle())
}
}
Run Code Online (Sandbox Code Playgroud)
这SidebarView是一个简单的List包含三个NavigationLink,每个一个Screen。
struct SidebarView: View {
@Binding var state: Screen?
var body: some View {
List {
NavigationLink(
destination: HomeView(), …Run Code Online (Sandbox Code Playgroud) 我有一个List包含NavigationLink在NavigationView. 我知道想用ContextMenu包含一个元素的来扩展视图,该元素在我的导航堆栈中显示另一个视图。
struct MainView: View {
@State var elements = ["Hello", "World"]
var body: some View {
NavigationView {
List(elements, id: \.self, rowContent: { element in
NavigationLink(destination: PresentView(element: element)) {
Text(element)
.contextMenu {
NavigationLink(
"Edit",
destination: EditView(element: element)
)
}
}
})
}
}
}
Run Code Online (Sandbox Code Playgroud)
正常点击我的项目的导航工作正常。然而,上下文菜单在 Xcode 11 Beta 5 中停止工作。我收到以下错误:`[WindowServer] display_timer_callback:意外状态。
如何从上下文菜单中将新视图推送到我的导航堆栈上?
我正在使用新的“纯”SwiftUIApp和Scene结构而不是AppDelegate.
我的一些视图接受自定义 url 方案和使用onOpenURL(perform:). 一切都按预期工作。
但是,从 Beta 6 开始,Xcodes 给出以下运行时警告:
运行时:SwiftUI:不能在不使用 SwiftUI 生命周期的情况下对 URL、NSUserActivity 和其他外部事件使用场景方法。如果没有 SwiftUI Lifecycle,广告和处理外部事件会浪费资源,并且会产生不可预测的结果。
我到底做错了什么?什么是SwiftUI生命周期指什么?
这就是我的主要App结构的样子。我将一些默认修饰符附加到主视图。
@main
struct MyApp: App {
@StateObject var viewModel = GlobalViewModel()
var body: some Scene {
WindowGroup {
MainView()
.applyingDefaultColors()
.environmentObject(viewModel)
.environmentObject(TranslationProvider())
.toggleStyle(SwitchToggleStyle(tint: .accentColor))
}
}
}
Run Code Online (Sandbox Code Playgroud)