Я хочу получить последние 7 записей из настроения модели. Я просто хочу, чтобы список содержал не более 7 записей, и это последние 7 из них. Я пробовал цикл for и цикл foreach, но все равно получаю сообщение об ошибке.
if selectedTab == "LAST 7 ENTRIES"{
ForEach(self.entryController.moods, id: \.id )
{mood in
NavigationLink(destination: EntryDetailView(entryController: self.entryController, mood: mood)) {
HStack{
VStack {
Text(mood.monthString)
.font(.title2)
.fontWeight(.bold)
.foregroundColor(mood.emotion.moodColor)
Text("\(mood.dayAsInt)")
.font(.title2)
.fontWeight(.bold)
.foregroundColor(mood.emotion.moodColor)
}
RowView(mood: mood)
}
}
}.onDelete { (index) in
self.entryController.deleteMood(at: index)
}
}
Это мой контроллер входа и модель
@Published var moods: [Mood] = [];
struct Mood: Codable, Equatable, Identifiable {
var id = UUID()
let emotion: Emotion
var activity: String?
var comment: String?
let date: Date
init(emotion: Emotion, activity: String?, comment: String?, date: Date) {
self.emotion = emotion
self.activity = activity
self.comment = comment
self.date = date
}
}
func loadFromPersistentStore() {
// Plist -> Data -> Stars
let fileManager = FileManager.default
guard let url = persistentFileURL, fileManager.fileExists(atPath: url.path) else { return }
do {
let data = try Data(contentsOf: url)
let decoder = PropertyListDecoder()
moods = try decoder.decode([Mood].self, from: data)
} catch {
print("error loading stars data: \(error)")
}
}
Разве это не то же самое вопрос, о котором вы спрашивали вчера, хотя и с немного другим именем пользователя? Вы должны обработать это в своем классе entryController, чтобы помимо вашего свойства moods
у вас также были свойства reversedMoods
и lastSevenMoods
, а затем использовать тот, который подходит для текущего варианта использования.
@JoakimDanielson Да, я хотел бы сделать это в своем контроллере ввода, но я не могу найти для этого образца, что сбивает с толку в этой части ...
Вот подход для вас, ваш вопрос не содержит необходимых кодов для ответа на него, однако в этом примере вы можете найти способ решения своей проблемы:
struct ContentView: View {
let array: [Int] = Array(1...28)
var body: some View {
ForEach(array.indices, id:\.self) { index in
if ((array.count - 7) < array[index]) {
Text("\(array[index])")
.padding()
}
}
}
}
вы можете попробовать что-то вроде этого:
if (entryController.moods.count >= 7) {
ForEach((entryController.moods.endIndex-7)..<entryController.moods.endIndex, id: \.self) { ndx in
let mood = entryController.moods[ndx]
// ...
}
.onDelete { index in
if let theFirst = index.first {
let ndx = (entryController.moods.endIndex-7) + theFirst
self.entryController.deleteMood(at: ndx)
}
}
}
Обратите внимание, что вам нужно будет настроить индекс в .onDelete
, как показано в примере кода.
Спасибо ! Эта работа для меня! На самом деле я хочу сделать это на моем контроллере ввода, а не на просмотре, но я тоже понятия не имею, это работа, но .ondelete есть какая-нибудь ссылка на то, как это настроить?
обновил мой ответ .onDelete
примером кода.
Попробуйте просто использовать suffix
для массива, документация здесь. Простейшим примером будет что-то вроде этого.
struct ContentView: View {
var items = [1,2,3,4,5]
var body: some View {
List {
ForEach(items.suffix(2), id: \.self) { item in
Text("\(item)")
}
}
.onAppear {
print(items.suffix(2))
}
}
}
вывод на печать
[4, 5]
«... но все равно получаю ошибку.», какую ошибку вы получаете и в какой строке?