ios 如何在onAppear修饰符中构建和调用函数,当我们想要在其中实现一个带有stride的for,以便在SwiftUI中显示SFSymbols

quhf5bfb  于 2023-03-24  发布在  iOS
关注(0)|答案(2)|浏览(118)

我在SwiftUI中实现了以下代码:

import SwiftUI

struct onAppearmodifier: View {
    
    @State var mytext: String = "Start"

    
    let symbols: [String] = ["globe", "heart.fill","house.fill"]
    var body: some View {
     
        NavigationView {
            ScrollView {
                ForEach(0..<200) { _ in
                     Rectangle()
                        .frame(width: 200, height: 200, alignment: .center)
                        .padding()
                        .onAppear {
                            
                            //call the function that I want to build
                            
                        }
                }
            }
            .onAppear {
                
                mytext = "Fine"
            }
            
        }
        
        
    }

我想使用stride构建一个函数,在画布上显示上面声明的带有句点3的每个矩形的SFSymbol,我想在onAppear()修饰符中为特定数量的矩形调用这个函数。我的想法是实现一个特定类型的函数,如果我是正确的,就使用下面的代码块

for index in stride(from: 0, to: symbols.count, by: 3) {
               let symbolGroup = Group {
                   Image(systemName: symbols[index])
                   Image(systemName: symbols[index + 1])
                   Image(systemName: symbols[index + 2])

但我不知道如何编码后,各种尝试。我卡住了。任何帮助或其他建议将不胜感激。

deyfvvtc

deyfvvtc1#

我不知道为什么你会认为onAppear在这里有用。如果你想要一个图像,使用Image
“period”可以通过将ForEach的当前索引的余数(不要用_扔掉它!)除以3(或者你有多少图像)来实现。

NavigationView {
    ScrollView {
        ForEach(0..<200) { i in
            Image(systemName: symbols[i % 3])
                .font(.system(size: 160)) // set the size of the symbol
                .padding()
        }
    }
}

我也不知道你为什么要用Rectangle,也许你想把图像用成overlay的矩形?

ForEach(0..<200) { i in
    Rectangle()
        .foregroundColor(.yellow)
        .frame(width: 200, height: 200, alignment: .center)
        .overlay {
            Image(systemName: symbols[i % 3])
                .font(.system(size: 160))
        }
        .padding()
}
qyuhtwio

qyuhtwio2#

这听起来像是你想在滚动视图中有行,每行有3个符号。你应该构建一个单独的子视图,它需要一个符号数组来显示在每行上。然后你还需要一个生成这些数组的函数。
你需要将绘制视图和准备数据分开。很难确定你想要实现什么,但是在下面的代码中,三个符号的集合被设置在一个显示数组中,这是在Appear上运行的。然后有一个视图,它接受数组并在forEach的每个循环中显示符号。
这个例子中的数组处理非常粗糙,需要小心操作以避免索引超出范围。希望它能为您提供结构化的方法。

struct ContentView: View {
    @State var mytext: String = "Start"
    @State var symbolGroups: [[String]] = []
    let symbolArray: [String] = [ "globe", "heart.fill","house.fill" ,  "pencil" , "pencil.circle.fill" , "pencil.circle" ]
    
    var body: some View {
        NavigationView {
            ScrollView {
                ForEach(symbolGroups.indices , id: \.self) { index in
                    RowView(symbols: symbolGroups[index])
                }
            }
        }
        .onAppear {
            createDisplayArrays()
        }
        
    }
    
    func createDisplayArrays() {
        var returnSymbolGroups: [[String]] = []
        for index in stride(from: 0, to: symbolArray.count - 1, by: 3) {
            print("Index is \(index)")
            var array: [String] = []
            for subIndex in index..<(index + 3) {
                array.append( symbolArray[subIndex] )
            }
            returnSymbolGroups.append(array)
        }
        self.symbolGroups = returnSymbolGroups
    }
    
}

struct RowView: View {
    var symbols: [String]
    
    var body: some View {
        HStack {
            ForEach(symbols , id: \.self) { symbol in
                Rectangle()
                    .frame(width: 100, height: 100, alignment: .center)
                    .padding()
                    .overlay {
                        Image(systemName: symbol).foregroundColor(.white)
                    }
            }
        }
    }

}

相关问题