代码之家  ›  专栏  ›  技术社区  ›  Richard Kirk

我可以在SwiftUI中用程序生成一系列视图吗?

  •  0
  • Richard Kirk  · 技术社区  · 4 年前

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

        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() 呼叫

        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.ModifiedContent<SwiftUI.ModifiedContent<SwiftUI.颜色, SwiftUI.AddGestureModifier<SwiftUI_结束手势<SwiftUI.点击手势>>>, SwiftUI_FrameLayout>, SwiftUI_套印格式修饰符<SwiftUI_形状视图<SwiftUI_笔划形状<SwiftUI.矩形_Inset>, SwiftUI.Color>>>'(0x109735e90)转换为“SwiftUI.Color”(0x1ec3b9eb8)。 2022-10-01 12:38:49.468445+0100 ByEye[2810:493288]无法施放 类型的值 'SwiftUI.ModifiedContent<SwiftUI.ModifiedContent<SwiftUI.ModifiedContent<SwiftUI.颜色, SwiftUI.AddGestureModifier<SwiftUI_结束手势<SwiftUI.点击手势>>>, SwiftUI_FrameLayout>, SwiftUI_套印格式修饰符<SwiftUI_形状视图<SwiftUI_笔划形状<SwiftUI.矩形_Inset>, SwiftUI.Color>>>'(0x109735e90)转换为“SwiftUI.Color”(0x1ec3b9eb8)。

    有一个巧妙的解决方案吗?

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

        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)
        }
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   Gavin Morrow    4 年前

    SwiftUI中的修改器实际上不会修改视图。相反,他们创建了一个新视图(例如。 ModifiedContent )属性已更改/已应用。

    每当我们对SwiftUI视图应用修改器时,我们实际上会创建一个应用了该更改的新视图,而不仅仅是原地修改现有视图。

    - Hacking With Swift

    因此,当您将所有修改器添加到“颜色”时,您将使其成为不同类型的视图。这就是为什么 as! Color 失败。

    要解决此问题,可以为rgb颜色创建一个“视图”。

    struct RgbColor: View {
        let i: Int
        // Add any other info the view needs as constants
    
        var body: some View {
           // ...
        }
    }
    

    要使用它:

    RgbColor(i: 1, /* other parameters */)
    

    我希望这能有所帮助!