#ios #swiftui
#iOS #swiftui
Вопрос:
У меня есть JournalView, который отображает список событий ScrollView-VStack. Всякий раз, когда в список добавляется новый элемент события, он в конечном итоге рисует представление несколько раз.
import SwiftUI
import Foundation
struct JournalView: View {
@EnvironmentObject var dailyData: DailyData
var body: some View {
GeometryReader { geometry in
VStack(spacing: 5) {
ZStack(alignment: .bottomTrailing) {
dailyEventsView()
.visibility(!showAddEventsMenu)
VStack(alignment: .trailing) {
AddEventsMenuButton()
}
}
}
}
}
private func dailyEventsView() -> some View {
return ScrollView {
VStack(alignment: .center) {
ForEach(dailyData.events) { event in
switch event.type {
case .WATER:
WaterCardView(eventID: event.id, dailyData: dailyData)
default:
HStack {}
}
}
}
}
}
private func AddEventsMenuButton() -> some View {
Button(action: {
dailyData.addEvent(event: Event(type: .WATER))
}){
Image(systemName: "plus.circle")
.resizable()
.frame(width: 40, height: 40)
.gradientForeground(colors: [.yellow, .orange, .red])
}
}
}
Вот как выглядит файл DailyData.swift
import SwiftUI
class DailyData: ObservableObject {
private let TAG: String = "(DailyData.self)"
@Published var events: [Event] = []
public func addEvent(event: Event) {
Log.d(tag: TAG, msg: "addEvent(event = (event.id))")
let index = eventIndex(eventID: event.id)
if index == -1 {
Log.d(tag: TAG, msg: "No previous index, adding...")
// Selection sort insert based on date/time.
if 0 == events.count {
Log.d(tag: TAG, msg: "No previous events, adding at index zero.")
events.append(event)
} else {
for i in 0 ..< events.count {
if event.dateTime >= events[i].dateTime {
events.insert(event, at: i 1)
}
}
}
}
Log.d(tag: TAG, msg: "WaterMacroProgress = (macroWaterProgress)")
}
public func eventIndex(eventID: String) -> Int {
for i in 0 ..< events.count {
if eventID == events[i].id {
return i
}
}
return -1
}
}
Когда вы добавляете первые два события, все хорошо, но затем, как только я начал добавлять третье четное и так далее, оно начинает рисовать представление несколько раз…
Это результат трехкратного нажатия кнопки «Добавить»:
Ответ №1:
Я понял ответ! После добавления в событие я никогда не вырываюсь из цикла!