SwiftUI如何让ForEach循环根据选择器中所选月份的天数进行迭代

SwiftUI如何让ForEach循环根据选择器中所选月份的天数进行迭代,swiftui,swiftui-list,swiftui-foreach,Swiftui,Swiftui List,Swiftui Foreach,所以我创建了一行代码,它有两个值,一年和一个月,根据你给它的值,它将计算给定年份中给定月份的天数。最初我打算使用状态变量,这样它就可以自动更新,但由于结构的工作方式,我不能使用刚刚初始化的变量。(如“无法在属性初始值设定项中使用实例成员'year';属性初始值设定项在'self'可用之前运行”错误)。我之所以需要这段代码,是因为我想要一个forEach循环根据这个数字自动迭代(因为我正在制作的应用程序在接下来的两年中每天都有一个列表)。这是我的密码: struct YearView: View

所以我创建了一行代码,它有两个值,一年和一个月,根据你给它的值,它将计算给定年份中给定月份的天数。最初我打算使用状态变量,这样它就可以自动更新,但由于结构的工作方式,我不能使用刚刚初始化的变量。(如“无法在属性初始值设定项中使用实例成员'year';属性初始值设定项在'self'可用之前运行”错误)。我之所以需要这段代码,是因为我想要一个forEach循环根据这个数字自动迭代(因为我正在制作的应用程序在接下来的两年中每天都有一个列表)。这是我的密码:

struct YearView: View {

@State var year = [2020, 2021, 2022]
//monthSymbols gets an array of all the months
@State var monthArray = DateFormatter().monthSymbols!
@State var yearIndex = 0
@State var monthIndex = 0
@State var month = 0
@State var daysInMonth = Calendar.current.range(of: .day, in: .month, for: Calendar.current.date(from: DateComponents(year: year, month: month + 1))!)!.count

var body: some View {
    NavigationView {
        
        
        List {
            Section {
                VStack {
                    Picker("Years", selection: $yearIndex) {
                        ForEach(0 ..< year.count) { index in
                            Text(String(self.year[index])).tag(index)
                        }
                    }
                    .pickerStyle(SegmentedPickerStyle())
                    
                    
                    Divider()
                    
                    if yearIndex == 0 {
                        Picker("Month", selection: $monthIndex) {
                            ForEach(6 ..< monthArray.count) { index in
                                Text(self.monthArray[index]).tag(index)
                            }
                        }
                        .padding(.bottom, 2)
                    } else {
                        Picker("Month", selection: $monthIndex) {
                            ForEach(0 ..< monthArray.count) { index in
                                Text(self.monthArray[index]).tag(index)
                            }
                        }
                        .padding(.bottom, 2)
                        
                    }
                }
            }
            
            Section {
                ForEach(0..<10) { i in
                    NavigationLink(destination: ContentView(day: dayData[i])) {
                        DayRow(day: dayData[i])
                    }
                }
            }
        }
        .navigationBarTitle(Text("\(monthArray[monthIndex + indexTest]) \(String(year[yearIndex]))"))
    }
    .listStyle(InsetGroupedListStyle())
}
}


我不知道我会在哪里运行,但是,如果这甚至会工作。我是SwiftUI和GitHub的新手,所以如果我能提供更多有用的信息,尽管问吧

据我所知,您应该能够在ForEach中调用getRange(年份:,月份:)函数。传入
yearIndex
monthIndex

我编写了这个小示例代码来快速测试理论。如果这是你要找的,请告诉我

-丹

struct ContentView:View{
@国有私营部门风险值年=3
@国有私营部门var月=2
var body:一些观点{
名单{
ForEach(0..Int{
返回Calendar.current.range(of:.day,in:.month,for:Calendar.current.date(from:DateComponents(year:year,month:month+1))!)!.count
}
}
编辑以解决评论中的问题

要正确更新选择器标签,请尝试将代码更改为:

Picker("Years", selection: $year) {
    ForEach(0 ..< year) { index in
        Text("\(index)")
    }
}
Picker(“年”,选择:$year){
ForEach(0..<年){年索引
文本(“\(索引)”)
}
}

看看这是否给了你想要的回应。你所做的并不是完全错误,我只是不太清楚你的最终意图是什么。但是,请仔细研究一下代码,我认为您的思路是正确的。

据我所知,您应该能够在ForEach中调用getRange(year:,month:)函数。传入
yearIndex
monthIndex

我编写了这个小示例代码来快速测试理论。如果这是你要找的,请告诉我

-丹

struct ContentView:View{
@国有私营部门风险值年=3
@国有私营部门var月=2
var body:一些观点{
名单{
ForEach(0..Int{
返回Calendar.current.range(of:.day,in:.month,for:Calendar.current.date(from:DateComponents(year:year,month:month+1))!)!.count
}
}
编辑以解决评论中的问题

要正确更新选择器标签,请尝试将代码更改为:

Picker("Years", selection: $year) {
    ForEach(0 ..< year) { index in
        Text("\(index)")
    }
}
Picker(“年”,选择:$year){
ForEach(0..<年){年索引
文本(“\(索引)”)
}
}

看看这是否给了你想要的回应。你所做的并不是完全错误,我只是不太清楚你的最终意图是什么。但是,请仔细阅读代码,我认为您的思路是正确的。

谢谢您的回答!我不知道您可以在for循环中输入函数,所以我已经这样做了,并且它在大多数情况下都有效!唯一的问题是,当我使用选择器更改monthIndex/yearIndex变量的值时,它不会更新正在显示的forEach循环值-知道如何解决这个问题吗?我更新了代码以可能解决您的问题。谢谢您的回答!我不知道您可以在for循环中输入函数,所以我已经这样做了,并且它在大多数情况下都有效!唯一的问题是,当我使用选择器更改monthIndex/yearIndex变量的值时,它不会更新正在显示的forEach循环值-知道如何解决这个问题吗?我更新了代码,以可能解决您的问题。
Picker("Years", selection: $year) {
    ForEach(0 ..< year) { index in
        Text("\(index)")
    }
}