SwiftUI 将 @ToolbarContent 提取到它自己的 var

God*_*her 3 ios swift swiftui

是否可以像使用一样在单独的 var 中提取工具栏内容@ViewBuilder?

我想提取它并设置 .toolBar(content: myToolBarContent)

var body: some View {
    NavigationView {
        List {
        }
        .toolbar(content: {
            ToolbarItem(placement: .principal) {
                Text("Hi")
            }
            ToolbarItem(placement: .navigationBarTrailing) {
                Text("Ho")
            }
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

Raj*_*han 19

如果您想将工具栏与主体分开,则需要为工具栏内容创建一个单独的结构。这是一个可能的演示。

struct ContentView: View {
    
    var body: some View {
        NavigationView {
            List {
            }
            .toolbar{MyToolBarContent()}
        }
    }
    
    struct MyToolBarContent: ToolbarContent {
        var body: some ToolbarContent {
            ToolbarItem(placement: .principal) {
                Text("Hi")
            }
            ToolbarItem(placement: .navigationBarTrailing) {
                Text("Ho")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 或者您可以简单地使用 [@ToolbarContentBuilder](https://developer.apple.com/documentation/swiftui/toolbarcontentbuilder)。它相当于 ToolbarContent 的 @ViewBuilder。 (3认同)

paw*_*222 7

您实际上不需要创建另一个结构 - 相反,您可以使用@ToolbarContentBuilder. 它@ViewBuilder相当于ToolbarContent:

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {}
                .toolbar(content: myToolBarContent)
        }
    }
    
    @ToolbarContentBuilder
    func myToolBarContent() -> some ToolbarContent {
        ToolbarItem(placement: .principal) {
            Text("Hi")
        }
        ToolbarItem(placement: .navigationBarTrailing) {
            Text("Ho")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这种方法相对于 @Raja Kishan 的符合 `ToolbarContent` 建议的 `struct` 的好处是它允许您访问和操作视图的 `@State` 变量。 (6认同)