首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将视图作为参数添加到自定义ViewModifier中

将视图作为参数添加到自定义ViewModifier中
EN

Stack Overflow用户
提问于 2020-12-21 23:05:02
回答 1查看 779关注 0票数 2

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

目前,我有一些使用AnyView运行的视图,但我想使用泛型视图语法,因为您随后将“一些视图”传递给这个答案中概述的视图:

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

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

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

下面是示例修饰符:

代码语言:javascript
复制
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)
        }
        
    }
}

及其用途:

代码语言:javascript
复制
struct SampleView: View {
    var body: some View {
        Rectangle()
            .modifier(SampleModifier(param1: 150, innerView: { param1, param2 in
                return AnyView(
                    Text("Inner View: \(param1) - \(param2)")
                )
            }))
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-21 23:16:44

您可以使用泛型,即使innerView返回某些视图:

代码语言:javascript
复制
struct SampleModifier<V>: ViewModifier where V: View {
    let param1: CGFloat
    let innerView: (CGFloat, CGFloat) -> V

    ...
}

那么你就不再需要AnyView了:

代码语言:javascript
复制
struct SampleView: View {
    var body: some View {
        Rectangle()
            .modifier(SampleModifier(param1: 150, innerView: { param1, param2 in
                Text("Inner View: \(param1) - \(param2)")
            }))
    }
}

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

代码语言:javascript
复制
extension View {
    func sampleModifier<V>(
        param1: CGFloat,
        innerView: @escaping (CGFloat, CGFloat) -> V
    ) -> some View where V: View {
        modifier(SampleModifier(param1: param1, innerView: innerView))
    }
}

像这样使用它:

代码语言:javascript
复制
struct SampleView: View {
    var body: some View {
        Rectangle()
            .sampleModifier(param1: 150, innerView: { param1, param2 in
                Text("Inner View: \(param1) - \(param2)")
            })
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65401146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档