【发布时间】:2021-05-04 21:52:16
【问题描述】:
我正在尝试构建一个自定义 NavigationView,但我正在努力解决如何实现自定义“.navigationBarItems(leading: /* insert views /, trailing: / insert Views */ )”。我假设我必须使用一个preferenceKey,但我不知道如何让它接受视图。
我的顶部菜单如下所示:
import SwiftUI
struct TopMenu<Left: View, Right: View>: View {
let leading: Left
let trailing: Right
init(@ViewBuilder left: @escaping () -> Left, @ViewBuilder right: @escaping () -> Right) {
self.leading = left()
self.trailing = right()
}
var body: some View {
VStack(spacing: 0) {
HStack {
leading
Spacer()
trailing
}.frame(height: 30, alignment: .center)
Spacer()
}
.padding(EdgeInsets(top: 0, leading: 10, bottom: 0, trailing: 10))
}
}
struct TopMenu_Previews: PreviewProvider {
static var previews: some View {
TopMenu(left: { }, right: { })
}
}
这是我尝试创建一个preferenceKey 来更新它,我显然错过了一些非常基本的东西:
struct TopMenuItemsLeading: PreferenceKey {
static var defaultValue:View
static func reduce(value: inout View, nextValue: () -> View) {
value = nextValue()
}
}
struct TopMenuItemsTrailing: PreferenceKey {
static var defaultValue:View
static func reduce(value: inout View, nextValue: () -> View) {
value = nextValue()
}
}
extension View {
func topMenuItems(leading: View, trailing: View) -> some View {
self.preference(key: TopMenuItemsLeading.self, value: leading)
self.preference(key: TopMenuItemsTrailing.self, value: trailing)
}
}
【问题讨论】:
-
navigationBarItems()正在将deprecated 切换到.toolbar模式。 Passing aView在 SO 中已被多次询问 -
谢谢,但不完全是。在上面的示例代码中,我自己将视图作为变量传递。这不是我正在努力解决的问题。它使用 View 作为让我难过的preferenceKey。我尝试像通常在视图中那样将视图传递给我的preferenceKey,但它没有按我预期的那样工作。
标签: swiftui