首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在SwiftUI中以编程方式生成一个视图序列吗?

我可以在SwiftUI中以编程方式生成一个视图序列吗?
EN

Stack Overflow用户
提问于 2022-10-01 11:59:45
回答 1查看 89关注 0票数 1

这是一段对我有用的代码..。

代码语言:javascript
复制
    VStack(spacing: pad/2) { 
        getRgbColor(i:0)
            .onTapGesture { editColor(i:0) }
            .frame(width: pad, height: pad)
            .border(.black.opacity(0.5), width: 1)
                
        getRgbColor(i:1)
            .onTapGesture { editColor(i:1) }
            .frame(width: pad, height: pad)
            .border(.black.opacity(0.5), width: 1)
 
        getRgbColor(i:2)
            .onTapGesture { editColor(i:2) }
            .frame(width: pad, height: pad)
            .border(.black.opacity(0.5), width: 1)
    }

原版有更多的条目。它起作用了,但你可以看到它是如何重复的。我可能想做一个6x4的补丁,看起来像一个麦克白目标,所以我想知道是否有更好的方法,不重复这么多。我试着把电话转到getRgbColor()电话里。

代码语言:javascript
复制
    func getRgbColor(i:Int) -> SwiftUI.Color {
        return SwiftUI.Color(red:   R + rgbDel[i][0] * step,
                             green: G + rgbDel[i][1] * step,
                             blue:  B + rgbDel[i][2] * step)
            .onTapGesture { editColor(i:0) }
            .frame(width: pad, height: pad)
            .border(.black.opacity(0.5), width: 1) as! Color 
    }

这是编译的,但当我运行它时给出了一个SIGABRT .

不能将'SwiftUI.ModifiedContent>>,SwiftUI._FrameLayout>、SwiftUI._OverlayModifier,SwiftUI.Color>>>‘(0x109735e90)转换为“SwiftUI.Color”(0x1ec3b9eb8)。2022-10-01 'SwiftUI.ModifiedContent>>,SwiftUI._FrameLayout>,SwiftUI._OverlayModifier,SwiftUI.Color>>> (0x109735e90)到SwiftUI.Color (0x1ec3b9eb8)的值为493288。

有好的解决办法吗?

是的有。我没想到调用修饰符会改变底层类型,因为我编写的大部分内容都是在cpp中编写的,在cpp中,这是不可想象的。在第一个注释之后,我编写并重新命名了getRgbColor()函数.

代码语言:javascript
复制
    func rgbButton(i:Int) -> some View {
        return SwiftUI.Color(red:   R + rgbDel[i][0] * step,
                             green: G + rgbDel[i][1] * step,
                             blue:  B + rgbDel[i][2] * step)
                .onTapGesture { editColor(i:i) }
                .frame(width: pad, height: pad)
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-01 13:41:34

SwiftUI中的修饰符实际上并不修改视图。相反,它们创建一个新视图(例如,ModifiedContent),其属性已更改/应用。

每当我们将修饰符应用于SwiftUI视图时,我们实际上创建了一个新视图,并应用了该更改--我们不只是修改现有的视图。

因此,当您向Color添加所有修饰符时,您将使其成为不同类型的视图。这就是为什么as! Color失败的原因。

要解决这个问题,您可以为rgb颜色创建一个视图。

代码语言:javascript
复制
struct RgbColor: View {
    let i: Int
    // Add any other info the view needs as constants

    var body: some View {
       // ...
    }
}

使用它:

代码语言:javascript
复制
RgbColor(i: 1, /* other parameters */)

我希望这能帮到你!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73918121

复制
相关文章

相似问题

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