SwiftUI:更新变量时导航链接会弹出

2023-11-30

我遇到这样的问题:更新变量时导航链接会弹出。这有点令人困惑,因为这种行为不会发生在应用程序的其他地方,但我正在做同样的事情。

首先,有一个符合可识别性的 Vehicle 结构。在内容视图中,它显示在滚动视图中的 NavigationView 中。

ScrollView(showsIndicators: false) {
            VStack {
                ForEach(user.vehicles) { vehicle in
                    VehicleListItem(user: $user,
                                    vehicle: vehicle)

                }
            }
        }

该列表项有一个导航链接,可将用户带到不同的视图。车辆作为绑定传递到下一个视图。

NavigationLink(destination: {
                VehicleView(user: $user,
                            vehicle: $user.vehicles[user.vehicles.firstIndex(where: {$0.id == vehicle.id})!],
                            make: vehicle.make,
                            model: vehicle.model,
                            year: vehicle.year
                )
            }, label: {
                Image(systemName: "car")
                    .font(.system(size: 100))
            }).padding(.bottom, 20)

在车辆视图中,用户可以编辑车辆信息(品牌、型号、年份)并且工作正常。当用户对车辆进行更改时,它不会弹回之前的视图。

Section() {
            VehicleHandler(make: $make, model: $model, year: $year)
            
            Button(action: {
                //Update
                vehicle.make = make
                vehicle.model = model
                vehicle.year = year
                
            }, label: {
                ButtonView(label: "Update")
            }).disabled(make.isEmpty ||
                        model.isEmpty ||
                        (make == vehicle.make && model == vehicle.model && year == vehicle.year))
        }

车辆处理程序

struct VehicleHandler: View {

enum Field: Hashable {
    case make
    case model
}

@FocusState private var field: Field?

@Binding var make: String
@Binding var model: String
@Binding var year: Int //Set to current year

var body: some View {
    TextField("Make", text: $make)
        .submitLabel(.next)
        .focused($field, equals: .make)
        .onSubmit {
            field = .model
        }
    
    TextField("Model", text: $model)
        .submitLabel(.done)
        .focused($field, equals: .model)

    
    Picker("Year", selection: $year, content: {
        ForEach((1900...Date().year()).reversed(), id: \.self) { year in
            Text(String(year))
                .tag(year as Int)
        }

    })
}

}

现在,用户可以添加维护记录。添加记录后,将使用 ForEach 显示该记录。这些记录也符合可识别的要求。

//Only show 5
            ForEach(vehicle.maintenanceRecords.prefix(5)) { record in
                NavigationLink(destination: {
                    MaintenanceView(user: $user,
                                    record: $vehicle.maintenanceRecords[vehicle.getMaintenanceIndex(id: record.id)],
                                    date: record.date,
                                    mileage: record.mileage ?? 0,
                                    note: record.note,
                                    cost: record.cost ?? 0,
                                    tasks: record.tasks)
                }, label: {
                    Text("\(record.date.formattedNoYear()) - \(record.note)")
                })
            }

相同的概念也用于编辑维护记录。记录作为绑定传递,记录信息被传递以更新各个字段。当用户按下更新时,它会更新记录。此时,只要您进行编辑并按“更新”,它就会弹出到 VehicleView。当我不使用 ID 时,我曾经遇到过这个问题,但是,每个结构都符合可识别的并且 ID 没有被修改。我已检查以确保它们保持不变,其中包括车辆 ID 和记录。有谁知道为什么它不断地回到这里,但当车辆信息更新时却没有?如果您需要更多信息,请与我们联系。

            RecordHandler(user: $user,
                      date: $date,
                      mileage: $mileage,
                      note: $note,
                      cost: $cost,
                      task: $task,
                      tasks: $tasks)
        
        Section() {
            Button(action: {
                
                //Update record
                record.date = date
                record.note = note
                record.tasks = tasks
                
                if mileage.isZero == false {
                    record.mileage = mileage
                }
                
                if cost.isZero == false {
                    record.cost = cost
                }
                
                //Clear task
                task = ""
            }, label: {
                ButtonView(label: "Update")
            }).disabled(note.isEmpty ||
                        (date == record.date && mileage == record.mileage && note == record.note && cost == record.cost && tasks == record.tasks)
            )
        }

记录处理程序

struct RecordHandler: View {

enum Field: Hashable {
    case note
    case mileage
    case cost
    case task
}

@FocusState var field: Field?

@Binding var user: User
@Binding var date: Date
@Binding var mileage: Float
@Binding var note: String
@Binding var cost: Float
@Binding var task: String
@Binding var tasks: [Vehicle.Record.Task]

@State var suggestion: String = ""

var body: some View {
    Section() {
        DatePicker("Date", selection: $date)
        TextField("Note", text: $note)
            .submitLabel(.next)
            .focused($field, equals: .note)
            .onSubmit {
                field = .mileage
            }
        FieldWithLabel(label: "Mileage", value: $mileage, formatter: NumberFormatter.number)
            .submitLabel(.next)
            .focused($field, equals: .mileage)
            .onSubmit {
                field = .cost
            }
        FieldWithLabel(label: "Cost", value: $cost, formatter: NumberFormatter.currency)
            .submitLabel(.next)
            .focused($field, equals: .cost)
            .onSubmit {
                field = .task
            }
    }
    
    //For task
    Section() {
        HStack {
            TextField("Task", text: $task)
                .submitLabel(.done)
                .focused($field, equals: .task)
                .onSubmit {
                    addTask()
                    field = .task
                }
                .toolbar(content: {
                    ToolbarItemGroup(placement: .keyboard) {
                        Spacer()

                        Button("Close") {
                            UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
                        }
                    }
                })
                .onChange(of: task, perform: { value in
                    //See if any of the saved task are similar
                    if user.tasks.contains(where: {$0.contains(value)}) {
                        //Set suggestion
                        suggestion = user.tasks.first(where: {$0.contains(value)})!
                    } else {
                        //Leave it empty if there's nothing
                        suggestion = ""
                    }
                })
            Spacer()
            
            Button(action: {
                addTask()
            }, label: {
                Image(systemName: "plus.circle.fill")
                    .font(.system(size: 22))
            }).buttonStyle(BorderlessButtonStyle())
            
        }
        
        //To show task suggestions
        if suggestion.isEmpty == false {
            Button(action: {
                //Set task to suggestion
                task = suggestion
                
                //Add task
                addTask()
                
                //Focus field
                field = .task
            }, label: {
                HStack {
                    Text("Suggestion")
                    Spacer()
                    Text(suggestion)
                }
            })
        }

        
        ForEach(tasks) { task in
            Text(task.name)
        }
        .onDelete(perform: delete)
    }

}

func addTask() {
    //Create
    let task = Vehicle.Record.Task(name: task)
    
    //Add to array
    tasks.append(task)
    
    //Clear
    self.task = ""
}

func delete(at offsets: IndexSet) {
    tasks.remove(atOffsets: offsets)
}

}


我遇到了同样的问题,今天成功解决了。尝试添加选项.navigationViewStyle(.stack)到您的导航视图

struct ContentView: View {
    var body: some View {
        NavigationView {
            //All your content and navigation links
        }.navigationViewStyle(.stack)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SwiftUI:更新变量时导航链接会弹出 的相关文章

随机推荐

  • 如何修复 IE 浏览器控件中的内存泄漏?

    我正在尝试在 C Winform 应用程序中嵌入 WebBrowser 控件 这听起来很容易 然而 我发现每次调用 Navigate 方法时 WebBrowser 控件都会占用大量内存 内存永远不会被释放 内存使用量不断增加 网上很多人都有
  • 将geojson标记加载到mapbox中设置自定义图标图像

    我是mapbox 传单的新手 我认为这是一个非常基本的问题 我在过去的两天里一直在努力解决这个问题 尽管我尝试了几种方法 但我无法解决这个问题 我通过 geojson 加载标记 var ma 3 L mapbox featureLayer
  • 检测和响应任何多边形内的球与墙碰撞

    需要编写良好的方法来检测和响应任何多边形内的球与墙的碰撞 例如 我有一个方法可以绘制一个在矩形内飞行的球 ctx beginPath ctx arc x y ballRadius 0 Math PI 2 ctx fillStyle 0095
  • Jasper 子报告未显示

    我有一份主要报告 调用2个不同的子报告两次 每次使用不同的参数 问题是显示不正确 LETTEROFACK TRANSF LTR 根本不来
  • 将数组从 php 发送到 python

    我正在尝试将一个数组从 php 传递到 python 由于某种原因 当我加载 php 页面时 我遇到了麻烦 所以如果人们建议我尝试不同的方法或者如果人们发现一个简单的方法 我将非常感激我在这里失踪了错误 因为我已经尝试这样做几个小时了 Th
  • 新工作表上的 VBA 数据透视表

    我已经录制了一个宏来在 VBA 中创建数据透视表和后续图表 它就像一种魅力 只是完全不是我需要的那样 问题是我希望能够运行代码并让它在尚不存在的工作表上创建一个表 基本上我将通过菜单上的按钮运行它 它应该在新页面上创建表格和图表 无需进一步
  • 从 Access 数据库收集数据

    我想从 Access 数据库的某些表中收集一些数据 我在网上找到了一些解决方案 但我还没有找到填充数据表或数据集并正确获取每个字段的方法 对我来说 获取整个表然后只获取我想要的信息是否更容易 或者我应该在访问数据库中进行大量搜索 每次只获取
  • 调试 PDO mySql 将 NULL 插入数据库而不是空

    我正在尝试使用 PDO 将 NULL 动态插入数据库 表结构 CREATE TABLE IF NOT EXISTS Fixes Id int 11 NOT NULL AUTO INCREMENT COMMENT PK CurrencyId
  • 没有名为 pkg_resources 的模块

    我正在将 Django 应用程序部署到开发服务器 并且在运行时遇到此错误pip install r requirements txt Traceback most recent call last File var www mydir vi
  • 当矩形与另一个矩形重叠时 OpenCV 连接轮廓

    我有以下输入图像 我的目标是绘制红色区域的轮廓 为此 我有以下代码 导入CV2 Read image src cv2 imread images jpg cv2 IMREAD GRAYSCALE Set threshold and maxV
  • IntelliJ IDEA Grails 没有看到 Jar

    我试图在 Linux 系统上的 Grails 项目中引用 IntelliJ IDEA 9 0 2 中的类 我将依赖项添加到BuildConfig groovy dependencies specify dependencies here u
  • “Substring” GridView BoundField 对象

    谁能告诉我如何对 GridView BoundField 对象进行子字符串化 到目前为止我已经尝试过了 但还没有成功 谢谢
  • 实体框架一对一映射问题

    使用VS 2010 beta 2 ASP NET MVC 我尝试创建一个实体框架文件并从数据库中获取数据 关系存在一些问题 因此我开始进行调整 但对于简单的一对一关系 我不断收到以下错误 错误 1 错误 113 多重性在关系 FK User
  • SWFTools 分段错误

    使用 swftools 中的 pdf2swf 将 PDF 转换为 SWF 时 出现分段错误 核心转储 错误 有没有人遇到过这个或知道可能出了什么问题 我在错误发生之前收到的通知是 NOTICE File contains jpeg pict
  • Google API - 每次都强制授予权限

    我正在使用 Google API PHP 客户端 每次我尝试登录时 我都被迫向应用程序授予权限 下面是我的代码 我基本上是访问 Google API for Analytics require once lib apiClient php
  • cvReprojectImageTo3D -2d 图像的 3d 建模问题 -

    我非常需要你关于这个问题的帮助 我正在尝试用 2D 图像对一个简单的场景进行 3D 建模 我使用 2 张图像 左 右 著名的筑波场景 http www cc gatech edu classes AY2003 cs7495 fall Pro
  • php 警告:strtotime() 错误

    我已将 joomla 和 wordpress 文件从旧服务器更改为新服务器 在前端和管理端 它的工作没有任何错误 但在数据库 phpmyadmin 部分它显示了一些像这样的警告消息 Warning strtotime function st
  • Post/Put 请求的路由错误(乘客标头)

    我遇到了一个奇怪的问题 经过一系列研究后无法更接近 我有几个通过 Carrierwave 上传文件的表单 当我上传信息时 部分路线被切断 我认为 例如 我有一个多部分表单提交到 https domain programs 223 add f
  • 线性回归 scala.MatchError:

    在 Spark 1 6 1 和 2 0 中使用 ParamGridBuilder 时出现 scala MatchError val paramGrid new ParamGridBuilder addGrid lr regParam Arr
  • SwiftUI:更新变量时导航链接会弹出

    我遇到这样的问题 更新变量时导航链接会弹出 这有点令人困惑 因为这种行为不会发生在应用程序的其他地方 但我正在做同样的事情 首先 有一个符合可识别性的 Vehicle 结构 在内容视图中 它显示在滚动视图中的 NavigationView