Here is the view in which it works
struct MileageHistoryView: View {
let vehicle: Vehicle
init(for vehicle: Vehicle) {
self.vehicle = vehicle
}
@Environment(\.modelContext) private var context
@Environment(\.editMode) private var editMode
var sorted: [Mileage] {
guard let history = vehicle.mileageHistory else { return [] }
return history.sorted(by: { $0.timestamp > $1.timestamp })
}
var body: some View {
List {
ForEach(sorted) { mileage in
MileageListItem(mileage, editing: Binding(get: {editMode?.wrappedValue.isEditing ?? false}, set: {_ in }))
}
.onDelete(perform: deleteMileage)
.deleteDisabled(editMode?.wrappedValue.isEditing ?? false ? false : true)
}
.id(editMode?.wrappedValue.isEditing)
.navigationTitle("Mileage History")
.scrollContentBackground(.hidden)
.toolbar {
ToolbarItem(placement: .topBarTrailing, content: {
EditButton()
})
}
}
}
Here is the other view where it doesn't work. In this view, it seems like when the EditButton is pressed, no change is happening with the editMode so deleteDisabled() is always set to true.
struct VehiclesView: View {
@Environment(\.modelContext) private var context
@Environment(\.editMode) private var editMode
// Local
@Query private var vehicles: [Vehicle]
@State private var addVehicle = false
@AppStorage("vehicle-edit-alert") private var showEditAlert = true
@State private var editAlert = false
@State private var editShown = false
var body: some View {
NavigationStack {
List {
ForEach(vehicles) { vehicle in
NavigationLink(destination: VehicleView(vehicle), label: {
VehicleListItem(vehicle)
})
}
.onDelete(perform: deleteVehicle)
.deleteDisabled(self.editMode?.wrappedValue.isEditing ?? false ? false : true)
}
.id(self.editMode?.wrappedValue.isEditing)
.scrollContentBackground(.hidden)
.navigationTitle("Vehicles")
.toolbar {
ToolbarItem(placement: .topBarLeading, content: {
if showEditAlert && !editShown {
Button("Edit") { editAlert = true }
} else {
EditButton()
}
})
ToolbarItem(placement: .topBarTrailing, content: {
Button(action: { addVehicle.toggle() }, label: { Image(systemName: "plus") })
.accessibilityHint("Opens the view to add a Vehicle")
})
}
.fullScreenCover(isPresented: $addVehicle, content: {
VehicleEditor()
})
}
.scrollIndicators(.hidden)
}
}
When EditButton() is used in the second view the list item is grayed out, but the buttons to delete aren't there.
Does anybody know why this is happening?
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
My app is using SwiftData with CloudKit integration. Everything at the moment is working fine. I have a struct that saves Data as an optional. This is Data related to an Image. It saves and loads as expected. When I disconnect my phone from wifi or my phone network, the image still loads. I'm assuming that means the Data is being stored locally on the phone as well. Is there a way to display what's stored locally to the user inside the application?
Edit: I've realized that CloudKit is saying the data is too large, but the images are still being saved. Does that mean they're only locally being saved?
I've been having trouble with finding a good way to allow the user to close the keyboard. Naturally, I'd like to use the keyboard toolbar but it's so inconsistent, it's impossible. Sometimes it shows up, other times it doesn't. At the moment, it's not appearing at all no matter where I put it. On the NavigationStack, on the List inside of it, on the TextField. It just doesn't appear. I added a TapGesture to my view to set my FocusState that I'm using for the fields back to nil, however, this stops the Picker I have from working. I tried using SimultaneousGesture with TapGesture, and that didn't work.
For example:
.simultaneousGesture(
TapGesture()
.onEnded() {
if field != nil {
field = nil
}
}
)
With the current setup, each TextField switches to the next TextField in the onSubmit. The last one doesn't, which will close the keyboard, but I want to give people the option to close the keyboard before that. Does anyone have a good way to close the keyboard?
Topic:
UI Frameworks
SubTopic:
SwiftUI
I previously got this error when I used a PassKey to log in. I'm not using that. I've put my password in multiple times, closed the browser, etc. It doesn't seem to be working. The only thing I can think is that because my Mac is using a different iCloud account, it's not letting me.
Does anyone have any ideas?