【问题标题】:Child NavigationView doesn't honor modifiers on iOS 15子 NavigationView 不支持 iOS 15 上的修饰符
【发布时间】:2021-12-07 09:25:16
【问题描述】:

我有一个孩子 NavigationView 不尊重修饰符的问题,您可以尝试使用以下单个代码文件工作应用程序查看:

import SwiftUI

@main
struct NavigationView_IssueApp: App {
    @StateObject var viewState = ViewState()
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(viewState)
        }
    }
}


struct ContentView: View {
    @EnvironmentObject var viewState: ViewState
    var body: some View {
        ZStack {
            Button("Tap Me") {
                viewState.showAllCards.toggle()
            }
            if !viewState.showAllCards {
                ChildNavigationView()
            }
        }
    }
}

struct ChildNavigationView: View {
    @EnvironmentObject var viewState: ViewState
    
    var body: some View {
        NavigationView {
            CardDetailView()
                .navigationBarTitleDisplayMode(.inline)
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
}

struct CardDetailView: View {
    @EnvironmentObject var viewState: ViewState
    
    var body: some View {
        Color.yellow
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button(action: { viewState.showAllCards.toggle() }) {
                        Text("Done")
                    }
                }
            }
    }
}

class ViewState: ObservableObject {
    init() {
        print("init ViewState")
    }
    @Published var showAllCards = true
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .environmentObject(ViewState())
    }
}

在画布预览中看起来不错。

在 iOS 14 设备上看起来不错。

在 iOS 15 设备上不支持修饰符。

有人知道这种奇怪的行为吗?

【问题讨论】:

    标签: swiftui ios15


    【解决方案1】:

    看起来像一个错误。这里找到了安全的解决方法

    struct ChildNavigationView: View {
        @EnvironmentObject var viewState: ViewState
        @State private var mode = NavigationBarItem.TitleDisplayMode.automatic
        var body: some View {
            NavigationView {
                CardDetailView()
                    .navigationBarTitleDisplayMode(mode)
            }
            .navigationViewStyle(StackNavigationViewStyle())
            .onAppear {
                mode = .inline  // << switch mode right after construction
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-05-09
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 2020-08-04
      • 2017-01-03
      • 2022-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多