SwiftUI-每4行在列表中添加额外的一行

q9yhzks0  于 2022-10-04  发布在  Swift
关注(0)|答案(0)|浏览(78)

在我的代码中,我在列表中显示数字。用户可以选择分组方法,数字将相应地放入区段(5个元素或奇数/偶数组)。现在,我想在4*n个元素后面添加一个绿色行,其中n=1,2,3,.从用户界面的Angular 来看(不是从数据源的Angular 看!)因此,在第四行之后,应该会有一排绿色的。在第八行之后,绿色的一行应该跟在后面,依此类推。

在我当前的代码中,这适用于5个元素的组,但不适用于奇/偶变量。问题似乎出在索引中,因为它们不依赖于实际位置。我知道这听起来有点复杂,但也许有人知道如何处理这个问题,最好是以某种可伸缩的方式,这样如果我在未来添加第三个分组方法,它也会起作用。

import SwiftUI
import Combine

struct ContentView: View {
    @StateObject var myViewModel = MyViewModel()

    var body: some View {
        VStack {
            Button {
                myViewModel.groupStrategy.send(myViewModel.groupStrategy.value == .multiplesOfFive ? .oddEven : .multiplesOfFive)
            } label: {
                Text("Toggle grouping strategy")
            }

            List() {
                ForEach(myViewModel.numOfSections, id:.self) { sectNum in
                    Section("Sc (sectNum)") {
                        ForEach(Array(myViewModel.nums.enumerated()), id: .offset) { idx, element in
                            let _ = print("Sc (sectNum) (idx) (element)")
                            if myViewModel.shouldSkipNumberInThisSection(number: element, sectionNumber: sectNum) {
                                EmptyView()
                            } else {
                                Text(element.description + " idx: " + idx.description)
                                if idx > 0 && (idx+1) % 4 == 0 {
                                    Color.green
                                }
                            }
                        }
                    }
                }
            }
        }
        .padding()
    }
}

class MyViewModel: ObservableObject {
    enum GroupStrategy {
        case multiplesOfFive
        case oddEven
    }

    @Published var nums: [Int]
    @Published var numOfSections: [Int] = []
    var groupStrategy = CurrentValueSubject<GroupStrategy, Never>(.multiplesOfFive)
    private var cancellables: Set<AnyCancellable> = []

    func shouldSkipNumberInThisSection(number: Int, sectionNumber: Int) -> Bool {
        switch groupStrategy.value {
        case .multiplesOfFive:
            return number >= sectionNumber * 5 || number < (sectionNumber-1) * 5
        case .oddEven:
            return sectionNumber == 0 ? (number % 2) == 0 : (number % 2) != 0
        }
    }

    func shouldPutGreenRow() -> Bool {
        return false
    }

    init() {
        self.nums = []
        let numbers: [Int] = Array(3...27)

        self.nums = numbers
        self.numOfSections = Array(1..<Int(nums.count / 5)+1)

        groupStrategy.sink { strategy in
            switch self.groupStrategy.value {
            case .multiplesOfFive:
                self.numOfSections = Array(1..<Int(self.nums.count / 5)+1)
            case .oddEven:
                self.numOfSections = Array(0..<2)
            }
        }.store(in: &cancellables)

    }
}

对于MultiesOfFive组-OK:

对于奇数/偶数组-不正常:

在奇数/偶数组中,绿色行应出现在数字9、17、25、8、16、24之后。相反,它只出现在偶数组中

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题