Я столкнулся с проблемой в цикле foreach, отображающей повторяющиеся представления с одним и тем же содержимым. например, отчет может содержать одни и те же строки, при выходе из представления будет отображаться следующее представление с тем же содержимым.
Мой цикл foreach:
Section(header: Text("Reports")) {
ForEach(stashed.userReports, id: \.self) { report in
NavigationLink(destination: ReportView(report: report)) {
VStack(alignment: .leading) {
Text("Date")
.bold()
Text(report)
}
}
}
}
модель
@Model
final class ActiveStash {
var substanceClass: String
var substance: String
var weight: UInt
var substanceCost: UInt?
var StashDescription: String?
var date: Date
var unit: String
var dosages: Int?
@Attribute(.unique) var userReports: [String]
Я пытался присвоить уникальный атрибут моему массиву userReports, но безуспешно.
Бро, похоже, проблема возникает потому, что массив userReports
считает отчеты с одинаковым содержимым идентичными, даже если это разные экземпляры. Это происходит потому, что userReports представляет собой массив строк и не различает отчеты с одинаковым содержимым.
Чтобы исправить это, вы можете изменить свою модель данных, чтобы использовать уникальный идентификатор для каждого отчета. Вот как вы можете это сделать:
Вместо хранения строк непосредственно в массиве userReports создайте новую структуру Report для представления каждого отчета. Эта структура может включать в себя такие свойства, как содержимое отчета и уникальный идентификатор.
Сделав это, вы гарантируете, что даже если два отчета имеют одинаковое содержимое, они будут рассматриваться как разные, поскольку каждый из них имеет свой собственный уникальный идентификатор. Это должно предотвратить проблему дублирования представлений, отображающих один и тот же контент.
// Define a struct for the report
struct Report: Identifiable {
let id = UUID()
let content: String // Change this to whatever properties your report has
}
// Modify the userReports array in ActiveStash to hold Report instances
@Model
final class ActiveStash {
// Your other properties...
// Instead of [String], use [Report]
@Attribute(.unique) var userReports: [Report]
}
// Modify your ForEach loop to use the unique identifier
Section(header: Text("Reports")) {
ForEach(stashed.userReports) { report in
NavigationLink(destination: ReportView(report: report)) {
VStack(alignment: .leading) {
Text("Date")
.bold()
Text(report.content) // Access the content of the report
}
}
}
}
Вам также необходимо привести Report в соответствие с Codable, поскольку он используется в классе @Model
.
@Omair Спасибо, я раньше пытался использовать структуру, но не до конца ее понял.
Сделайте идентификатор чем-то стабильным и уникальным.