[英]Add a ProgressView during a simple URLSession POST request in SwiftUI
I wanted to show a progress view during a simple URL POST request process.我想在一个简单的 URL POST 请求过程中显示进度视图。 What I would like to do is the button to turn into a ProgressView
spinner (usually it's default) as it's going through the requestTest
function process.我想做的是将按钮变成ProgressView
微调器(通常是默认设置),因为它正在通过requestTest
function 进程。 After the request is done, then the progress view goes away and turns back into a button.请求完成后,进度视图消失并变回按钮。
here's the code.这是代码。
struct ContentView: View {
@State private var tweetID = ""
@State private var tweetStatus = ""
@State private var response = ""
@State var showAlert = false
@State var sendToWebhook = false
var body: some View {
NavigationView {
Form {
Section(footer: Text("Test")) {
TextField("Field to place response data", text: $response)
TextEditor( text: $tweetStatus)
.frame(height: 100)
}
Section {
Button("Get Data") {
// Where progress should start before function
ProgressView("Test", value: 100, total: 100)
requestTest() { results in
response = results
if response == "No Data!" {
showAlert = true
}
}
}
if self.requestTest {
ProgressView()
}
}
}
.alert(isPresented: $showAlert) {
Alert(title: Text("Tweet Sent"), message: Text("Your Tweet is sent! Your Tweet ID is shown in the field"), dismissButton: .default(Text("OK")))
}
}
}
func requestTest(completion: @escaping(String) -> ()) {
if let url = URL(string: "https://requestbin.net/r/ag4ipg7n") {
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
var components = URLComponents(url: url, resolvingAgainstBaseURL: false)!
components.queryItems = [ URLQueryItem(name: "TweetID", value: response),
URLQueryItem(name: "Status", value: tweetStatus)]
if let query = components.url!.query {
request.httpBody = Data(query.utf8)
}
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let data = data,
let apiResponse = String(data: data, encoding: .utf8) {
// IF Completed, these actions are shown below
completion(apiResponse)
self.showAlert = true
tweetStatus = ""
} else {
completion("No Data!")
}
}
task.resume()
}
}
}
I thought if I tried to do as a if self.requestTest { ProgressView() }
, but no avail as it throwed me a error that says Cannot convert value of type '(@escaping (String) -> ()) -> ()' to expected condition type 'Bool'
.我想如果我尝试这样做if self.requestTest { ProgressView() }
,但无济于事,因为它给了我一个错误,上面写着Cannot convert value of type '(@escaping (String) -> ()) -> ()' to expected condition type 'Bool'
。
Is there a way to do that?有没有办法做到这一点?
there are a number of ways to do what you ask.有多种方法可以满足您的要求。 This is just one approach:这只是一种方法:
struct ContentView: View {
@State private var tweetID = ""
@State private var tweetStatus = ""
@State private var response = ""
@State var showAlert = false
@State var sendToWebhook = false
@State var inProgress = false // <--- here
var body: some View {
NavigationView {
Form {
Section(footer: Text("Test")) {
TextField("Field to place response data", text: $response)
TextEditor( text: $tweetStatus)
.frame(height: 100)
}
Section {
Button("Get Data") {
inProgress = true // <--- here
requestTest() { results in
inProgress = false // <--- here
response = results
if response == "No Data!" {
showAlert = true
}
}
}
if inProgress { // <--- here
ProgressView()
}
}
}
.alert(isPresented: $showAlert) {
Alert(title: Text("Tweet Sent"), message: Text("Your Tweet is sent! Your Tweet ID is shown in the field"), dismissButton: .default(Text("OK")))
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.