gpt4 book ai didi

ios - 将 View 作为参数添加到自定义 ViewModifier

转载 作者:行者123 更新时间:2023-12-02 02:27:45 25 4
gpt4 key购买 nike

这更像是一个句法问题。我试图在不使用 AnyView 的情况下将 View 传递到 ViewModifier 初始化程序。

目前我有一些使用 AnyView 运行的东西,但我想使用通用 View 语法,因为您随后会将“某些 View ”传递给此处此答案中概述的 View :

How to pass one SwiftUI View as a variable to another View struct

我似乎无法让它与 ViewModifier 一起工作。

目的(如示例中所示)是让修饰符将计算值传递到 innerView 中。我也很乐意使用 @ViewBuilder 以某种方式指定 innerView 属性,因为这可能会产生相同的效果。

这是示例修改器:

struct SampleModifier: ViewModifier {

let param1: CGFloat
let innerView: (CGFloat, CGFloat) -> AnyView

// Assume these are calculated states
let calculatedParam1: CGFloat = 100
let calculatedParam2: CGFloat = 100

func body(content: Content) -> some View {
ZStack {
HStack {
Spacer()

innerView(self.calculatedParam1, self.calculatedParam2)
.padding(.leading, 10)
.frame(width: param1)
}

content.frame(width: 100, height: 100)
}

}
}

及其用途:

struct SampleView: View {
var body: some View {
Rectangle()
.modifier(SampleModifier(param1: 150, innerView: { param1, param2 in
return AnyView(
Text("Inner View: \(param1) - \(param2)")
)
}))
}
}

最佳答案

您可以使用泛型,即让 innerView 返回一些 View :

struct SampleModifier<V>: ViewModifier where V: View {
let param1: CGFloat
let innerView: (CGFloat, CGFloat) -> V

...
}

那么你就不再需要AnyView了:

struct SampleView: View {
var body: some View {
Rectangle()
.modifier(SampleModifier(param1: 150, innerView: { param1, param2 in
Text("Inner View: \(param1) - \(param2)")
}))
}
}

或者,您可以创建一个View 扩展:

extension View {
func sampleModifier<V>(
param1: CGFloat,
innerView: @escaping (CGFloat, CGFloat) -> V
) -> some View where V: View {
modifier(SampleModifier(param1: param1, innerView: innerView))
}
}

并像这样使用它:

struct SampleView: View {
var body: some View {
Rectangle()
.sampleModifier(param1: 150, innerView: { param1, param2 in
Text("Inner View: \(param1) - \(param2)")
})
}
}

关于ios - 将 View 作为参数添加到自定义 ViewModifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65401146/

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