如何根据 SwiftUI 中的 @State 更改导航视图的导航视图样式?
Posted
技术标签:
【中文标题】如何根据 SwiftUI 中的 @State 更改导航视图的导航视图样式?【英文标题】:How to change the Navigation View Style of a Navigation View depending on a @State in SwiftUI? 【发布时间】:2021-04-15 06:46:22 【问题描述】:我目前在SwiftUI
中与Navigation View
合作。
问题:我想使用 @State & @Binding
将 Navigation View Style
从 Descendent View
更改为。
@Binding var defaultNavigationStyle: Bool
var body: some View
NavigationView
sidebar
Text("Choose an Option from the Sidebar.")
Text("Select an Element.")
.navigationViewStyle(defaultNavigationStyle ? DefaultNavigationViewStyle() : StackNavigationViewStyle())
显然,这不起作用,因为元素具有不同的类型。 错误消息: '?:' 表达式中的结果值具有不匹配的类型 'DefaultNavigationViewStyle' 和 'StackNavigationViewStyle'
问题:如何使用@State & @Binding
更改Navigation View Style
,而不创建一个完全不同的 NavigationView 并丢失所有 State
?
【问题讨论】:
【参考方案1】:您可以使用条件修饰符:
extension View
typealias ContentTransform<Content: View> = (Self) -> Content
@ViewBuilder
func conditionalModifier<TrueContent: View, FalseContent: View>(
_ condition: Bool,
ifTrue: ContentTransform<TrueContent>,
ifFalse: ContentTransform<FalseContent>
) -> some View
if condition
ifTrue(self)
else
ifFalse(self)
并将其应用于NavigationView
:
NavigationView
sidebar
Text("Choose an Option from the Sidebar.")
Text("Select an Element.")
.conditionalModifier(
defaultNavigationStyle,
ifTrue: $0.navigationViewStyle(DefaultNavigationViewStyle()) ,
ifFalse: $0.navigationViewStyle(StackNavigationViewStyle())
)
【讨论】:
以上是关于如何根据 SwiftUI 中的 @State 更改导航视图的导航视图样式?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swiftui 中根据彼此初始化 @State 变量?
如何在 SwiftUI 中使用 UIButton 更改 @State var
当从 GeometryReader 中进行更改时,SwiftUI 不会反映对 @Binding @State 变量的更改