Meditations 與階段具有一對多的關系,我根據 order 屬性對 Meditations 進行了排序,當我點擊編輯時,我通過移動它們來改變它,這很有效。現在我想對冥想的詳細視圖中的階段做同樣的事情。
我嘗試為 DetailView 做一個新的 FetchRequest,以便我可以使用與冥想相同的方法,但我無法針對特定的冥想指定它(如果可以避免新的 FetchRequest,這可能不是最好的方法)思考)。
我還嘗試使用 .sorted 對串列項進行排序,但是當在編輯模式下更改訂單時它并沒有立即更新,您必須來回查看更改。
有沒有辦法使這些方法中的一種起作用?當然,我也對其他解決方案持開放態度。
這是冥想的觀點:
import SwiftUI
import CoreData
struct ContentView: View {
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Meditation.order, ascending: true)])
private var meditations:FetchedResults<Meditation>
@State private var add = false
var body: some View {
NavigationView {
List {
ForEach(meditations){meditation in
NavigationLink(destination: {
DetailView(meditation: meditation)
}, label: {
Text(meditation.title ?? "")
Text("\(meditation.order)")
})
}
.onDelete(perform: deleteMeditation)
.onMove(perform: moveItem)
}
.navigationTitle("Meditations")
.sheet(isPresented: $add){
AddView()
}
.toolbar {
ToolbarItem(placement:.navigationBarTrailing){
EditButton()
}
ToolbarItem(placement:.navigationBarTrailing){
Button(action: {
add.toggle()
}, label: {
Label("Add Meditation",systemImage: "plus")
})
}
}
}
}
private func deleteMeditation(at offset:IndexSet){
withAnimation {
for index in offset{
let meditationToDelete = meditations[index]
do{
viewContext.delete(meditationToDelete)
try viewContext.save()
}catch{
print("Error while deleting Meditation \(error.localizedDescription)")
}
}
}
}
private func moveItem(at sets:IndexSet,destination:Int) {
let itemToMove = sets.first!
print (itemToMove)
print (destination)
if itemToMove < destination {
var startIndex = itemToMove 1
let endIndex = destination - 1
print (startIndex)
print (endIndex)
var startOrder = meditations[itemToMove].order
while startIndex <= endIndex {
meditations[startIndex].order = startOrder
startOrder = startOrder 1
startIndex = startIndex 1
}
meditations[itemToMove].order = startOrder
} else if destination < itemToMove {
var startIndex = destination
let endIndex = itemToMove - 1
var startOrder = meditations[destination].order 1
let newOrder = meditations[destination].order
while startIndex <= endIndex {
meditations[startIndex].order = startOrder
startOrder = startOrder 1
startIndex = startIndex 1
}
meditations[itemToMove].order = newOrder
}
do {
try viewContext.save()
}
catch {
print(error.localizedDescription)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
這是顯示階段的詳細視圖:
import SwiftUI
struct DetailView: View {
let meditation : Meditation
@Environment(\.managedObjectContext) var viewContext
@Environment(\.dismiss) var dismiss
@State private var addStage = false
@State private var showingDeleteAlert = false
@State private var isPresented = false
var body: some View {
VStack {
Text(meditation.wrappedDetails)
List{
ForEach(meditation.meditationStage){meditationStage in
MeditationStageDetailCell(meditationStage: meditationStage)
}
.onMove(perform: moveStage)
.onDelete(perform: deleteStage)
}
Spacer()
Button ("Begin"){
isPresented.toggle()
}
.fullScreenCover(isPresented: $isPresented) {
MeditatingView(meditation: meditation)
}
Spacer()
}
.navigationTitle(meditation.wrappedTitle)
.navigationBarTitleDisplayMode(.inline)
.alert("Delete Meditation?", isPresented: $showingDeleteAlert) {
Button ("Delete", role: .destructive, action: deleteMeditation)
Button ("Cancel", role: .cancel) {}
} message: {
Text("This action can't be undone")
}
.toolbar{
ToolbarItem(placement:.navigationBarTrailing){
Button {
showingDeleteAlert = true
} label: {
Label ("Delete this Stage", systemImage: "trash")
}
}
ToolbarItem(placement:.navigationBarTrailing){
EditButton()
}
ToolbarItem(placement:.navigationBarTrailing){
Button(action: {
addStage.toggle()
}, label: {
Label("Add Stage",systemImage: "plus")
})
}
}
.sheet(isPresented: $addStage){
AddMeditationStageView(meditation: meditation)
}
}
private func deleteMeditation() {
viewContext.delete(meditation)
try? viewContext.save()
dismiss()
}
private func deleteStage(at offset:IndexSet){
for index in offset{
let stageToDelete = meditation.meditationStage[index]
do{
viewContext.delete(stageToDelete)
meditation.stages -= 1
try viewContext.save()
} catch {
print("Error while deleting Meditation \(error.localizedDescription)")
}
}
}
private func moveStage(at sets:IndexSet,destination:Int) {
let itemToMove = sets.first!
print (itemToMove)
print (destination)
if itemToMove < destination {
var startIndex = itemToMove 1
let endIndex = destination - 1
print (startIndex)
print (endIndex)
var startOrder = meditation.meditationStage[itemToMove].order
print(startOrder)
while startIndex <= endIndex {
meditation.meditationStage[startIndex].order = startOrder
startOrder = startOrder 1
startIndex = startIndex 1
}
meditation.meditationStage[itemToMove].order = startOrder
} else if destination < itemToMove {
var startIndex = destination
let endIndex = itemToMove - 1
var startOrder = meditation.meditationStage[destination].order 1
let newOrder = meditation.meditationStage[destination].order
while startIndex <= endIndex {
meditation.meditationStage[startIndex].order = startOrder
startOrder = startOrder 1
startIndex = startIndex 1
}
meditation.meditationStage[itemToMove].order = newOrder
}
do {
try viewContext.save()
}
catch {
print(error.localizedDescription)
}
}
}
uj5u.com熱心網友回復:
@FetchRequest
private var stages: FetchedResults<MeditationStage>
init(meditation: Meditation) {
let sortDescriptors = [SortDescriptor(\MeditationStage.timestamp]
_stages = FetchRequest(sortDescriptors: sortDescriptors, predicate: NSPredicate(format: "meditation = %@", meditation), animation: .default)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/529753.html