SwiftUI-自定义导航“;“后退”;按钮,奇怪地在视图之间来回跳跃
情况是这样的,我已经设置了主视图/详细视图。从“事件”视图导航到“事件详细信息”视图时。如果用户点击“返回”按钮,我使用“按钮(操作:{self.presentationMode.wrappedValue.disease()})…”设计了“返回”按钮,则视图将临时更改回事件列表,但随后自动跳回用户导航的详细信息视图 以下是事件列表页面上的代码SwiftUI-自定义导航“;“后退”;按钮,奇怪地在视图之间来回跳跃,swiftui,Swiftui,情况是这样的,我已经设置了主视图/详细视图。从“事件”视图导航到“事件详细信息”视图时。如果用户点击“返回”按钮,我使用“按钮(操作:{self.presentationMode.wrappedValue.disease()})…”设计了“返回”按钮,则视图将临时更改回事件列表,但随后自动跳回用户导航的详细信息视图 以下是事件列表页面上的代码 import SwiftUI import Firebase struct EventsView: View { @Environment(\.pres
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
}
}
导入快捷界面
进口火基
结构事件视图:视图{
@环境(\.presentationMode)变量presentationMode:绑定
@状态变量数据:[EventObject]=[]
设db=Firestore.Firestore()
var body:一些观点{
ZStack{
VStack{
名单{
ForEach((self.data),id:\.self.eventID){item in
NavigationLink(目标:EventDetail()){
VStack{
HStack{
文本(“\(item.eventDate)”)
.font(.footnote)
.foregroundColor(颜色(“正文”))
垫片()
}
HStack{
文本(“\(item.eventTitle)”)
.fontWeight(.粗体)
.foregroundColor(颜色(“木炭”))
垫片()
}.padding(.top,8)
}.padding(.bottom,16)
}//导航
}
垫片()
}
.padding(.top,60)
}
//浮动导航条
ZStack{
VStack{
GeometryReader{gr in
HStack{
按钮(操作:{self.presentationMode.wrappedValue.disease()}){
图像(系统名称:“chevron.left”)
.foregroundColor(颜色(“木炭”))
.padding(.leading,16)
HStack{
文本(“探索·迪斯尼事件”)
.font(.system(大小:15))
.fontWeight(.粗体)
.foregroundColor(颜色(“木炭”))
.padding()
垫片()
}
}.框架(宽度:gr.size.width*0.92,高度:48)
.背景(颜色(“背景”))
.转弯半径(8)
阴影(颜色:颜色(“阴影”),半径:10,x:2,y:7)
}.padding(.leading,16)
垫片()
}
}
.padding(.top,50)
.edgesIgnoringSafeArea(.top)
//浮动导航端
}
}.onAppear(执行:self.queryEvents)
}
函数查询事件(){
self.data.removeAll()
中的self.db.collectionGroup(“事件”).getDocuments(){(querySnapshot,err)
如果让err=err{
打印(“获取文档时出错\(错误)”)
}否则{
用于querySnapshot!.documents中的文档{
让id=document.documentID
让title=document.get(“eventTitle”)作为!字符串
让shortDesc=document.get(“eventShort”)作为!字符串
让description=document.get(“eventDescription”)作为!字符串
让date=document.get(“eventDate”)作为!时间戳
设aDate=date.dateValue()
let formatter=DateFormatter()
formatter.dateFormat=“E,MMM d·h:mm a”
let formattedTimeZoneStr=formatter.string(from:aDate)
让address=document.get(“eventAddress”)作为!字符串
让cost=document.get(“eventCost”)为!Double
让location=document.get(“eventLocation”)作为!字符串
让webURL=document.get(“eventURL”)作为!字符串
self.data.append(EventObject(id:id,title:title,shortDesc:shortDesc,description:description,date:formattedTimeZoneStr,address:address,cost:cost,location:location,webURL:webURL))
}
}
}
}
}
类EventObject:ObservableObject{
@已发布的var-eventID:String
@已发布的var eventTitle:String
@已发布的var eventShort:String
@已发布的var eventDescription:字符串
@已发布的var eventDate:String
@已发布的var eventAddress:String
@已发布var事件成本:双
@已发布的var eventLocation:String
@已发布的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=标题
eventShort=shortDesc
eventDescription=描述
eventDate=日期
eventAddress=地址
事件成本=成本
eventLocation=位置
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)
}
}
}
导入快捷界面
进口火基
导入地图套件
结构EventDetail:视图{
@环境(\.presentationMode)变量presentationMode:
结合
//var-eventID:String
//var eventTitle:String
//var-eventShort:String
//var eventDescription:String
//var-eventDate:String
//var事件地址:字符串
//var事件成本:双倍
//var eventLocation:String
//var eventURL:String
var body:一些观点{
ZStack{
VStack{
GeometryReader{gr in
HStack{
按钮(操作:{self.presentationMode.wrappedValue.disease()}){
图像(系统名称:“chevron.left”)
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()
}
}
}