為什么在我使用“滑動洗掉”洗掉一個 scrum 后,EditButton 顯示“完成”(而不是“編輯”)?
我嘗試在 onDelete 中將 editMode 更改為 .inactive,但即使這樣也沒有用。
為什么這不起作用,我可以以某種方式修復它嗎?是新的bug嗎?
struct ScrumsView: View {
@Binding var scrums: [DailyScrum]
@Environment(\.scenePhase) private var scenePhase
@State private var isPresentingNewScrumView = false
@State private var newScrumData = DailyScrum.Data()
let saveAction: ()->Void
var body: some View {
List {
ForEach($scrums) { $scrum in
NavigationLink(destination: DetailView(scrum: $scrum)) {
CardView(scrum: scrum)
}
.listRowBackground(scrum.theme.mainColor)
}
.onDelete { indexSet in
scrums.remove(atOffsets: indexSet)
}
}
.navigationTitle("Daily Scrums")
.toolbar {
ToolbarItemGroup(placement: .navigationBarLeading) {
EditButton()
}
ToolbarItemGroup(placement: .navigationBarTrailing) {
Button {
isPresentingNewScrumView = true
} label: {
Image(systemName: "plus")
}
.accessibilityLabel("New scrum")
}
}
.sheet(isPresented: $isPresentingNewScrumView) {
NavigationView {
DetailEditView(data: $newScrumData)
//.navigationTitle(Text("New Scrum"))
.toolbar {
ToolbarItemGroup(placement: .cancellationAction) {
Button("Dismiss") {
isPresentingNewScrumView = false
newScrumData = DailyScrum.Data()
}
}
ToolbarItemGroup(placement: .confirmationAction) {
Button("Add") {
let newScrum = DailyScrum(data: newScrumData)
scrums.append(newScrum)
isPresentingNewScrumView = false
newScrumData = DailyScrum.Data()
}
}
}
}
}
.onChange(of: scenePhase) { phase in
if phase == .inactive { saveAction() }
}
}
}
uj5u.com熱心網友回復:
似乎EditButton與這種@StateObject用于宣告商店物件的新方式不兼容。我有想法嘗試恢復到創建商店物件的舊方式,令人驚訝的是它解決了這個問題。改成ScrumStore這個
class ScrumStore: ObservableObject {
@Published var scrums: [DailyScrum] = []
static var shared = ScrumStore()
并將其更改ScrumdingerApp為:
struct ScrumdingerApp: App {
private var store = ScrumStore.shared
var body: some Scene {
WindowGroup {
NavigationView {
ScrumsView(store: store) {
ScrumsView對此:
struct ScrumsView: View {
//@Binding var scrums: [DailyScrum]
@ObservedObject var store: ScrumStore
...
var body: some View {
List {
ForEach($store.scrums) { $scrum in
并將另一個更改scrums為store.scrums太。
這使得編輯按鈕可以正常作業以滑動洗掉
我還將通過使 store 物件成為 Environment 物件來改進代碼,例如
struct ScrumdingerApp: App {
private var store = ScrumStore.shared
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(store)
}
}
struct ContentView: View {
@EnvironmentObject var store: ScrumStore
...
我還將改進模型結構的加載和保存方式,例如,我將在物件的 init 中加載它并具有保存它的功能。該函式可以在場景階段或模型變異后呼叫。在進行過多的加載和保存之前,您可能想嘗試一下FileDocument哪個可以為您完成所有這些并免費為您提供 iCloud 驅動器支持。我推薦檔案應用 WWDC 視頻來了解這一點,每年都有一個新的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/468373.html
