ios - 异步调用后如何将新视图推送到 NavigationStack
问题描述
我正在尝试学习 SwiftUI 的基础知识(来自 UIKit)。
我只是想在async
通话结束后推送一个新视图,但我不知道怎么做。
这是我的测试实现:
struct MasterView: View {
@State var parralaxOffset: CGFloat = 0
func handleParralax(_ reader: GeometryProxy) -> some View {
self.parralaxOffset = reader.frame(in: .global).minY
return Text("Foreground contentOffset: \(reader.frame(in: .global).minY)")
}
var body: some View {
NavigationView {
Group {
Button(action: {
self.dummyAsynCall() {
//Push a new view
}
}) {
Text("Button")
}
}
}.navigationBarTitle("test")
}
private func dummyAsynCall(_ onComplete: @escaping (() -> ())) {
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) {
print("Call completed")
onComplete()
}
}
}
我知道,NavigationLink
但它们是同步工作的(当用户基本上点击它时)。
有谁知道如何在完成块中执行导航?
解决方案
您需要使用NavigationLink(destination: tag: selection:)
并添加一个@State
var,我已将其称为已完成,然后您需要使用NavigationLink(destination: tag: selection:)
where 标记将是这种情况下的预期值true
,并且在选择参数中您需要@State
在这种情况下传递 var$finished
import SwiftUI
struct LandmarkList: View {
@State var finished : Bool? = nil
let landmark = landmarkData[0]
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: LandmarkDetails(currentLandmark: self.landmark), tag: true, selection: self.$finished) {
Button(action: {
self.dummyAsynCall() {
self.finished = true
}
}) {
Text("Button")
}
}
}
}.navigationBarTitle("test")
}
private func dummyAsynCall(_ onComplete: @escaping (() -> ())) {
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) {
print("Call completed")
onComplete()
}
}
}
你可以在这里找到更好的解释;)https://mecid.github.io/2019/07/17/navigation-in-swiftui/
推荐阅读
- php - 提交后删除 symfony 表单域
- c - 正在研究如何使用函数调用数组来打印所述数组?
- powershell - Azure 自动化 vs Azure Runbooks vs Azure CLI vs Azure DSC vs Azure ARM vs Azure API
- scala - 为什么相同的排序在排序数组和优先级队列中表现相反?
- qt - 如何向 QSplitter 添加布局?
- c# - 使用 Activator.CreateInstance 将数据传递到其他页面
- java - simplexml 转换器总是将 java 类名写为 xml 根标签
- python - 芹菜:重新启动工人后未处理“task_revoked”信号
- linux - 使用 5 个输入文件时,bash xargs plus bash paste 可以准确输出 3 个文件吗?
- razor - 每个循环内部的 Html.TextBoxFor 输入不起作用