【发布时间】:2019-10-26 21:23:25
【问题描述】:
我正在尝试重新创建与股票 iOS 日历应用程序中的事件列表匹配的视图。我有以下代码,它生成一个事件列表,每个事件按日期分隔成自己的部分:
var body: some View {
NavigationView {
List {
ForEach(userData.occurrences) { occurrence in
Section(header: Text("\(occurrence.start, formatter: Self.dateFormatter)")) {
NavigationLink(
destination: OccurrenceDetail(occurrence: occurrence)
.environmentObject(self.userData)
) {
OccurrenceRow(occurrence: occurrence)
}
}
}
}
.navigationBarTitle(Text("Events"))
}.onAppear(perform: populate)
}
这段代码的问题是,如果在同一日期有两个事件,它们会被分成具有相同标题的不同部分,而不是被组合到同一个部分中。
作为一个 Swift 新手,我的直觉是做这样的事情:
ForEach(userData.occurrences) { occurrence in
if occurrence.start != self.date {
Section(header: Text("\(occurrence.start, formatter: Self.dateFormatter)")) {
NavigationLink(
destination: OccurrenceDetail(occurrence: occurrence)
.environmentObject(self.userData)
) {
OccurrenceRow(occurrence: occurrence)
}
}
} else {
NavigationLink(
destination: OccurrenceDetail(occurrence: occurrence)
.environmentObject(self.userData)
) {
OccurrenceRow(occurrence: occurrence)
}
}
self.date = occurrence.start
但在 Swift 中,这给了我错误“无法推断复杂的闭包返回类型;添加显式类型以消除歧义”,因为我在 ForEach{} 中调用任意代码 (self.date =occurrence.start),这是'不允许。
实现这一点的正确方法是什么?是否有更动态的方式来执行此操作,或者我是否需要以某种方式在 ForEach{} 之外抽象代码?
编辑:Occurrence 对象如下所示:
struct Occurrence: Hashable, Codable, Identifiable {
var id: Int
var title: String
var description: String
var location: String
var start: Date
var end: String
var cancelled: Bool
var public_occurrence: Bool
var created: String
var last_updated: String
private enum CodingKeys : String, CodingKey {
case id, title, description, location, start, end, cancelled, public_occurrence = "public", created, last_updated
}
}
更新: 以下代码为我提供了一个字典,其中包含由同一日期键入的事件数组:
let myDict = Dictionary( grouping: value ?? [], by: { occurrence -> String in
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .none
return dateFormatter.string(from: occurrence.start)
})
self.userData.latestOccurrences = myDict
但是,如果我尝试在我的视图中使用它,如下所示:
ForEach(self.occurrencesByDate) { occurrenceSameDate in
// Section(header: Text("\(occurrenceSameDate[0].start, formatter: Self.dateFormatter)")) {
ForEach(occurrenceSameDate, id: occurrenceSameDate.id){ occurrence in
NavigationLink(
destination: OccurrenceDetail(occurrence: occurrence)
.environmentObject(self.userData)
) {
OccurrenceRow(occurrence: occurrence)
}
}
// }
}
(当我得到主要部分工作时,部分内容被注释掉了)
我收到此错误:无法将类型“_.Element”的值转换为预期的参数类型“发生”
【问题讨论】:
-
您能否包括您对发生的定义?
-
您可能希望重新格式化您传递给 ForEach 的数据,以便在尝试显示之前已按日期划分。
-
@LuLuGaGa,更新为 Occurrence。这是一个简单的对象,通过可编码的方式填充 JSON 数据。
-
@Andrew,你有这方面的例子吗?我之前尝试过创建返回 NavigationLink 对象的函数,但我无法让它工作。
标签: ios swift swiftui swiftui-list