gpt4 book ai didi

ios - 如何实现自定义 View 修饰符

转载 作者:行者123 更新时间:2023-12-01 21:52:39 27 4
gpt4 key购买 nike

明确地说,我是 不是 询问如何使用 ViewModifier 协议(protocol)来创建一个带有 body 函数的结构,然后可以使用它来修改 View 。这个问题有点不同。

我正在尝试创建 NavigationView 结构的可重用替代方案,该结构使用 @Viewbuilder 启用尾随闭包语法大部分成功,这使我能够使用我命名为“NavBarView”的 View ,如下所示:

NavBarView(foregroundColor: .gray) {
Text("Child view")
}

它使用以下初始化程序:
init(foregroundColor: Color, @ViewBuilder content: () -> Content) {
self.foregroundColor = foregroundColor
self.content = content()
}

如果您想查看 NavBarView 结构,我可以在这里发布所有代码,但为了简洁起见,我没有。

这段代码编译得很好,并创建了如下所示的预期效果:

enter image description here

但是,我希望能够实现将项目添加到“导航栏”的可选功能,类似于在导航 View 内的 View 上调用 .navigationBarItems(trailing: ) 的方式。不过,我不确定我是否可以实现这一点。

到目前为止,我尝试的是在 NavBarView 结构中创建一个名为 item 的可选 state 属性,它的类型 Item 符合 View 如下:
@State var item: Item?

然后将此项目放入 HStack 中,以便当它不是可选的时,它应该显示在“父 View ”文本旁边。

然后我在 NavBarView 结构中编写了以下函数:
func trailingItem(@ViewBuilder _ item: () -> Item) -> some View {
self.item = item()
return self
}

然后我尝试像这样调用函数:
NavBarView(foregroundColor: .gray) {
Text("Child view")
}.trailingItem{Text("test test")}

但是,我没有出现任何文本,并且我连接以打印出项目属性中的内容的调试按钮打印出 nil,因此由于某种原因,该函数没有将项目属性设置为文本( “测试一下”)。

我会以完全错误的方式解决这个问题吗?有人可以阐明我如何才能实现所需的行为吗?

最佳答案

这是可能的方法,对修改器的唯一小修正

extension NavBarView {
func trailingItem(@ViewBuilder _ item: @escaping () -> Item) -> some View {
var view = self // make modifiable
view.item = item()
return view
}
}

所以你不需要把它写成 @State ,只需将其声明为
fileprivate var item: Item?
使用 Xcode 11.4 测试

关于ios - 如何实现自定义 View 修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61486653/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com