避免在NavigationView中嵌入不同视图的SwiftUI代码重复

t0ybt7op  于 2023-05-16  发布在  Swift
关注(0)|答案(1)|浏览(186)

我使用下面的代码来显示一个与Vision框架一起工作的视图。该视图嵌入在NavigationView中,该NavigationView显示标题和用于关闭所显示视图的按钮。

.sheet(isPresented: $isVisionPresented) {
#if targetEnvironment(simulator)
    NavigationView {
        Text("Cannot run Vision framework in Simulator")
            .navigationTitle("Sample title")
            .navigationBarTitleDisplayMode(.inline)
            .toolbar {
                Button("Close") {
                    isVisionPresented = false
                }
            }
    }
#else
    NavigationView {
        VisionView()
            .navigationTitle("Sample title")
            .navigationBarTitleDisplayMode(.inline)
            .toolbar {
                Button("Close") {
                    isVisionPresented = false
                }
            }
    }
#endif
}

由于Vision框架在Simulator中不可用,因此我使用targetEnvironment(simulator)来显示一个虚拟视图,仅用于测试目的。
有没有什么聪明的方法来避免两个视图中相同部分的重复代码?值得注意的是,VisionView实现了UIViewControllerRepresentable

.navigationTitle("Sample title")
.navigationBarTitleDisplayMode(.inline)
.toolbar {
    Button("Close") {
        isVisionPresented = false
    }
}
pgvzfuti

pgvzfuti1#

最后我使用了以下利用[ViewModifier][1]的解决方案。

struct NavigationBar: ViewModifier {
    @Binding var isPresented: Bool
    
    let navigationTitle: String
    let buttonTitle: String
    
    func body(content: Content) -> some View {
        content
            .navigationTitle(navigationTitle)
            .navigationBarTitleDisplayMode(.inline)
            .toolbar {
                Button(buttonTitle) {
                    isPresented = false
                }
            }
    }
}

extension View {
    func navigationBar(isPresented: Binding<Bool>, navigationTitle: String, buttonTitle: String) -> some View {
        modifier(NavigationBar(isPresented: isPresented, navigationTitle: navigationTitle, buttonTitle: buttonTitle))
    }
}

可以像下面这样使用:

Text("Cannot run Vision framework in Simulator")
    .navigationBar(isPresented: $isVisionPresented, navigationTitle: "Dummy title", buttonTitle: "Close")

相关问题