NavigationLink или Sheet onTap Gesture
Я новичок в Swift, я пытаюсь создать тестовое приложение, в котором у меня есть люди в списке, все работает для вставки новых людей, мне также удалось провести пальцем для удаления, но я не могу найти правильную процедуру для нажатия на контакте и откройте лист или представление навигации со всеми подробностями. Я использую MVVM, это код:
Модель:
import Foundation
struct ClienteModel : Identifiable, Codable {
let id : String
let cognome : String
let nome : String
let indirizzo : String
let città : String
let telefono : String
init(id: String = UUID().uuidString, cognome: String, nome: String, indirizzo: String, città: String, telefono: String) {
self.id = UUID().uuidString
self.cognome = cognome
self.nome = nome
self.indirizzo = indirizzo
self.città = città
self.telefono = telefono
}
func updateCompletion() -> ClienteModel {
return ClienteModel(id: id, cognome: cognome, nome: nome, indirizzo: indirizzo, città: città, telefono: telefono)
}
}
ViewModel:
import Foundation
class ListViewModel: ObservableObject {
@Published var clienti: [ClienteModel] = [] {
didSet {
salvaClienti()
}
}
typealias storage = [ClienteModel]
let clientiKey : String = "clienti_list"
init() { caricaClienti()}
func caricaClienti() {
guard
let data = UserDefaults.standard.data(forKey: clientiKey),
let clientiSalvati = try? JSONDecoder().decode([ClienteModel].self, from: data)
else { return }
self.clienti = clientiSalvati
}
func cancellaCliente(indexSet: IndexSet) {
clienti.remove(atOffsets: indexSet)
}
func muoviCliente(from: IndexSet, to: Int) {
clienti.move(fromOffsets: from, toOffset: to)
}
func aggiungiCliente(cognome: String, nome: String, indirizzo:String, città: String, telefono: String) {
let nuovoCliente = ClienteModel(cognome: cognome, nome: nome, indirizzo: indirizzo, città: città, telefono: telefono)
clienti.insert(nuovoCliente, at: 0)
salvaClienti()
}
func aggiornaClienti(item: ClienteModel) {
if let index = clienti.firstIndex(where: { $0.id == item.id}) {
clienti[index] = item.updateCompletion()
}
}
func salvaClienti() {
if let encodedData = try? JSONEncoder().encode(clienti) {
UserDefaults.standard.set(encodedData, forKey: clientiKey)
}
}
}
И ListView, в котором я остановился на команде onTap :-(
import SwiftUI
struct ListView: View {
@EnvironmentObject var listViewModel : ListViewModel
//@State private var showingDetailView = false
//@State var selectedCliente: ClienteModel
//@State private var mostraSheet: Bool = false
var body: some View {
ZStack {
// if listViewModel.clienti.isEmpty {
// Text("LISTA VUOTA")
// } else {
List {
ForEach(listViewModel.clienti) { item in
ClienteRowView(cliente: item)}
.onDelete(perform: listViewModel.cancellaCliente)
.listStyle(InsetGroupedListStyle())
.listRowInsets((EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 10)))
.onTapGesture {
}
}
}
.toolbar {
ToolbarItem(placement: .principal, content: {
Text("ColorLite App")})}
.navigationViewStyle(StackNavigationViewStyle())
.navigationBarTitleDisplayMode(.inline)
.navigationBarItems(
//leading:
//NavigationLink("Add", destination: AddView()),
trailing:
NavigationLink("Add", destination: AddView()))
}
}
struct ListView_Previews: PreviewProvider {
static var previews: some View {
// let previewCliente = ClienteModel(cognome: "", nome: "", indirizzo: "", città: "", telefono: "" )
NavigationView {
ListView()
}
.environmentObject(ListViewModel())
}
}
Любая помощь простыми словами будет очень признательна... Спасибо!
1 ответ
опять мы вдвоем :)
Ты должен завернуть
List
в
NavigationView
а затем использовать
NavigationLink
который приведет вас к DetailView. Нет необходимости в TapGestures.
NavigationView {
List {
ForEach(clienti) { item in
NavigationLink {
ClienteDetailView(cliente: item)
} label: {
ClienteRowView(cliente: item)
}
}
}
.listStyle(InsetGroupedListStyle())
}