SwiftUI - пользовательская навигационная кнопка «Назад», странным образом перепрыгивающая назад и вперед между видами - PullRequest
1 голос
/ 21 января 2020

Вот ситуация, у меня настроено представление Master / Detail. При переходе из представления «События» в представление «Сведения о событиях». Если пользователь нажимает кнопку «Назад», которую я разработал с помощью «Button (action: {self.presentationMode.wrappedValue.dismiss ()}) ..», представление временно вернется к списку «События», но затем перейдет автоматически возвращается к представлению сведений, с которого пользователь осуществлял навигацию.

Вот код на странице списка событий

import SwiftUI
import Firebase

struct EventsView: View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
@State var data: [EventObject] = []

let db = Firestore.firestore()


var body: some View {
    ZStack {
        VStack {
            List {
                ForEach((self.data), id: \.self.eventID) { item in
                    NavigationLink(destination: EventDetail()) {
                    VStack {
                        HStack{
                            Text("\(item.eventDate)")
                                .font(.footnote)
                                .foregroundColor(Color("bodyText"))
                            Spacer()
                        }
                        HStack {
                            Text("\(item.eventTitle)")
                                .fontWeight(.bold)
                                .foregroundColor(Color("Charcoal"))
                            Spacer()
                        }.padding(.top, 8)
                    }.padding(.bottom, 16)

                } // nav

                }
                Spacer()
            }


                .padding(.top, 60)
        }
        //Floating Navbar
        ZStack {
            VStack {
                 GeometryReader { gr in
                     HStack {
                         Button(action: {self.presentationMode.wrappedValue.dismiss()}) {
                             Image(systemName: "chevron.left")
                                 .foregroundColor(Color("Charcoal"))
                                 .padding(.leading, 16)
                             HStack {
                                 Text("Explore · Disney Events")
                                     .font(.system(size: 15))
                                     .fontWeight(.bold)
                                     .foregroundColor(Color("Charcoal"))

                                     .padding()
                                 Spacer()
                             }
                         }.frame(width: gr.size.width * 0.92, height: 48)
                             .background(Color("navBackground"))

                             .cornerRadius(8)
                             .shadow(color: Color("Shadow"), radius: 10, x: 2, y: 7)

                     }.padding(.leading, 16)
                     Spacer()
                 }
             }
             .padding(.top, 50)
             .edgesIgnoringSafeArea(.top)
            // Floating Nav Ends
        }
    }.onAppear(perform: self.queryEvents)

}
func queryEvents() {
    self.data.removeAll()
    self.db.collectionGroup("events").getDocuments() {(querySnapshot, err) in
        if let err = err {
            print("Error getting documents \(err)")
        } else {
            for document in querySnapshot!.documents {
                let id = document.documentID
                let title = document.get("eventTitle") as! String
                let shortDesc = document.get("eventShort") as! String
                let description = document.get("eventDescription") as! String
                let date = document.get("eventDate") as! Timestamp
                let aDate = date.dateValue()
                let formatter = DateFormatter()
                formatter.dateFormat = "E, MMM d · h:mm a"
                let formattedTimeZoneStr = formatter.string(from: aDate)
                let address = document.get("eventAddress") as! String
                let cost = document.get("eventCost") as! Double
                let location = document.get("eventLocation") as! String
                let webURL = document.get("eventURL") as! String
                self.data.append(EventObject(id: id, title: title, shortDesc: shortDesc, description: description, date: formattedTimeZoneStr, address: address, cost: cost, location: location, webURL: webURL))
            }
        }
    }
}


}





class EventObject: ObservableObject {
@Published var eventID: String
@Published var eventTitle: String
@Published var eventShort: String
@Published var eventDescription: String
@Published var eventDate: String
@Published var eventAddress: String
@Published var eventCost: Double
@Published var eventLocation: String
@Published var eventURL: String


init(id: String, title: String, shortDesc: String, description: String, date: String, address: String, cost: Double, location: String, webURL: String) {
    eventID = id
    eventTitle = title
    eventShort = shortDesc
    eventDescription = description
    eventDate = date
    eventAddress = address
    eventCost = cost
    eventLocation = location
    eventURL = webURL
}
}

Ниже приведен код детализации события. Я пытался забрать вещи, чтобы найти причину. Кажется, он изолирован от вызова Firebase.

import SwiftUI
import Firebase
import MapKit

struct EventDetail: View {
@Environment(\.presentationMode) var presentationMode: 
Binding<PresentationMode>

//    var eventID: String
//    var eventTitle: String
//    var eventShort: String
//    var eventDescription: String
//    var eventDate: String
//    var eventAddress: String
//    var eventCost: Double
//    var eventLocation: String
//    var eventURL: String

    var body: some View {
        ZStack {

            VStack {
                GeometryReader { gr in
                    HStack {
                        Button(action:         {self.presentationMode.wrappedValue.dismiss()}) {
                            Image(systemName: "chevron.left")
                                .foregroundColor(Color("Charcoal"))
                                .padding(.leading, 16)
                            HStack {
                                Text("Events · Event Details")
                                    .font(.system(size: 15))
                                    .fontWeight(.bold)
                                    .foregroundColor(Color("Charcoal"))        
                                .padding()
                            Spacer()
                        }
                    }.frame(width: gr.size.width * 0.92, height: 48)
                        .background(Color("navBackground"))

                        .cornerRadius(8)
                        .shadow(color: Color("Shadow"), radius: 10, x: 2, y: 7)

                }.padding(.leading, 16)
                Spacer()
            }
        }
        .padding(.top, 50)
        .edgesIgnoringSafeArea(.top)



    }
}


}

Вот видео, иллюстрирующее то, о чем я говорю. Dropbox Video Link

1 Ответ

1 голос
/ 22 января 2020

Вот демонстрация возможного подхода, основанного на упрощенном варианте ваших представлений. Идея состоит в том, чтобы использовать NavigationLink конструктор на основе тегов / выборок и передавать привязку к выделению на EventDetail, чтобы деактивировать выборку через привязку и, таким образом, активировать обратную навигацию.

Примечание: я думаю, что presentationMode не был разработан для сценария навигации.

struct EventsView: View {
    @State private var selectedItem: Int? = nil

    var body: some View {
        NavigationView {
            List {
                ForEach(0..<10, id: \.self) { item in
                    NavigationLink("Item \(item)", destination: EventDetail(selected: self.$selectedItem), tag: item, selection: self.$selectedItem)
                }
            }
        }
    }
}

struct EventDetail: View {
    @Binding var selected: Int?
    var body: some View {
        VStack {
            HStack {
                Button(action: { self.selected = nil }) {
                    Image(systemName: "chevron.left")
                    HStack {
                        Text("Events · Event Details")
                            .padding()
                        Spacer()
                    }
                }
                .navigationBarHidden(true)
                .navigationBarBackButtonHidden(true)
            }
            Spacer()
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...