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