如何将plotehandler的结果用于Swift中的导航链接的目的地?
我有一个函数调用REST API,并通过完整的Handler返回结果。
按下导航链接时,我想调用此功能,但将结果当作为对象传递到目标时使用。无法完全弄清楚如何做到这一点,或者是否可能。这是我当前的代码:
剩下的函数
func postProgramme(programmeName: String, programmeDays: Int, programmeDescription: String, completeionHandler: @escaping ProgrammeCompletionHandler) {
struct PostRoutineData: Codable {
let programmeName: String
let programmeDays: Int
let programmeDescription: String
}
let postProgrammeData = PostRoutineData(programmeName: programmeName, programmeDays: programmeDays, programmeDescription: programmeDescription)
do {
let jsonData = try JSONEncoder().encode(postProgrammeData)
let jsonString = String(data: jsonData, encoding: .utf8)!
let request = RESTRequest(path: "/workout/programme", body: jsonString.data(using: .utf8))
Amplify.API.post(request: request) { result in
switch result {
case .success(let data):
do {
//let str = String(decoding: data, as: UTF8.self)
let programme = try self.decoder.decode(Programme.self, from: data)
completeionHandler(programme)
} catch {
print("[ERROR] Error within postProgrammes()", error)
}
case .failure(let error):
print("[ERROR] Error within postProgrammes()", error)
}
}
} catch {
print("[ERROR] Error within postProgramme()", error)
}
}
导航链接,我试图解决问题:
NavigationLink(destination: ProgrammeDetailView(), isActive: $shouldTransit) {
Text("Create Programme")
.onTapGesture {
self.createNewProgramme()
self.shouldTransit = true
}
}
func createNewProgramme() -> ProgrammeDetailView {
sessionManager.postProgramme(programmeName: programmeName, programmeDays: programmeDays, programmeDescription: programmeDescription, completeionHandler: {(programme) -> ProgrammeDetailView in
return ProgrammeDetailView(programme: programme)}
}
I have a function which calls a REST API and returns the result via a completionHandler.
I want to call this function when pressing a NavigationLink but use the result as the object passed into the destination. Can't quite figure out how to do this, or if it's even possible. Here's my current code:
The REST function
func postProgramme(programmeName: String, programmeDays: Int, programmeDescription: String, completeionHandler: @escaping ProgrammeCompletionHandler) {
struct PostRoutineData: Codable {
let programmeName: String
let programmeDays: Int
let programmeDescription: String
}
let postProgrammeData = PostRoutineData(programmeName: programmeName, programmeDays: programmeDays, programmeDescription: programmeDescription)
do {
let jsonData = try JSONEncoder().encode(postProgrammeData)
let jsonString = String(data: jsonData, encoding: .utf8)!
let request = RESTRequest(path: "/workout/programme", body: jsonString.data(using: .utf8))
Amplify.API.post(request: request) { result in
switch result {
case .success(let data):
do {
//let str = String(decoding: data, as: UTF8.self)
let programme = try self.decoder.decode(Programme.self, from: data)
completeionHandler(programme)
} catch {
print("[ERROR] Error within postProgrammes()", error)
}
case .failure(let error):
print("[ERROR] Error within postProgrammes()", error)
}
}
} catch {
print("[ERROR] Error within postProgramme()", error)
}
}
The NavigationLink, and my attempt to figure the problem out:
NavigationLink(destination: ProgrammeDetailView(), isActive: $shouldTransit) {
Text("Create Programme")
.onTapGesture {
self.createNewProgramme()
self.shouldTransit = true
}
}
func createNewProgramme() -> ProgrammeDetailView {
sessionManager.postProgramme(programmeName: programmeName, programmeDays: programmeDays, programmeDescription: programmeDescription, completeionHandler: {(programme) -> ProgrammeDetailView in
return ProgrammeDetailView(programme: programme)}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
假设这是一个iOS应用,如果您可以为iOS 15部署,则可以使用async函数并返回
program ,而不是使用完成处理程序,可以使用最近的异步/等待环境。
program
:@State
typeprogram的var?
,它将被绑定到programMedEtailView
中的另一个变量。函数
createNewprogramme()
将更新状态变量。programMedEtailView
中创建@binding
变量。下面的示例可以将任何视图作为参数接收,但是由于REST API需要一些时间来响应,因此您需要处理program == nil
:Assuming it's an iOS app, if you can deploy for iOS 15, you can use the recent async/ await environment, by using an async function and returning a
Programme
, instead of using a completion handler.Programme
:@State
var of typeProgramme?
, that will be binding to another variable inProgrammeDetailView
.The function
createNewProgramme()
will update the state variable.@Binding
variable inProgrammeDetailView
. The example below can receive any view as a parameter, but because the REST API will take some time to respond, you need to handle the case whereprogramme == nil
: