Me gustaría dar a los usuarios la opción de eliminar los elementos de la List de la barra lateral de una aplicación SwiftUI en macOS.
Esto es lo que tengo actualmente:
import Foundation import SwiftUI @main struct FoobarApp: App { @StateObject private var modelData = ModelData() var body: some Scene { WindowGroup { ContentView() .environmentObject(modelData) } .commands { } } } class ModelData: ObservableObject { @Published var myLinks = [URL(string: "https://google.com")!, URL(string: "https://apple.com")!, URL(string: "https://amazon.com")!] } struct ContentView: View { @EnvironmentObject var modelData: ModelData @State private var selected: URL? var body: some View { NavigationView { List(selection: $selected) { Section(header: Text("Bookmarks")) { ForEach(modelData.myLinks, id: \.self) { url in NavigationLink(destination: Text("Viewing detailed data for: \(url)") ) { Text(url.absoluteString) } .tag(url) } } } .onDeleteCommand { if let selection = selected { modelData.myLinks.remove(at: modelData.myLinks.firstIndex(of: selection)!) } } .toolbar { Button("Selected") { print(selected ?? "Nothing selected") } } Text("Choose a link") } .frame(minWidth: 200, minHeight: 500) } } Cuando selecciono uno de los enlaces de la barra lateral y presiono el botón delete en mi teclado, el enlace se elimina, pero la vista detallada no siempre se borra.
Aquí hay un gif de lo que me refiero:
Me gustaría que la vista de detalles vuelva al texto predeterminado, Choose a link , después de que el usuario elimine un enlace. ¿Hay alguna manera de arreglar esto?
Además, noté que ContentView.selected no se borra después de que se elimina un enlace. ¿Es esto esperado? (Incluí un botón Selected que imprime el contenido de esta variable)
Estoy usando macOS 12.2.1 y Xcode 13.2.1.
Gracias por adelantado.
La razón por la que esto no funciona es porque su Vista de destino a la derecha no se actualiza cuando cambia el Estado en su barra lateral. Mueva la lógica al modelo de vista y cree una vista designada que contenga la interfaz de usuario para los detalles.
mueva la var seleccionada a su modelo de vista:
class ModelData: ObservableObject { @Published var myLinks = [ URL(string: "https://google.com")!, URL(string: "https://apple.com")!, URL(string: "https://amazon.com")!] @Published var selected: URL? }crear una nueva vista para el destino:
struct DestinationView: View{ @EnvironmentObject var modelData: ModelData var body: some View{ if let selected = modelData.selected{ Text("Viewing detailed data for: \(selected)") }else{ Text("Choose a link") } } }cambiar el destino de la vista de navegación:
NavigationLink(destination: DestinationView() ) { Text(url.absoluteString) }cambia tu modificador ondelete:
if let selection = modelData.selected { modelData.myLinks.remove(at: modelData.myLinks.firstIndex(of: selection)!) } modelData.selected = nil