【发布时间】:2021-10-21 01:32:01
【问题描述】:
我需要在视图加载之前获取数据并在按钮文本中显示数据。
Locations.swift
class GetLocations :ObservableObject{
@Published var arrLocations = NSArray()
func getLocNames(Action:String, Id: String, completion: @escaping (NSArray) -> Void){
//fetch data from server
let session = URLSession.shared
session.dataTask(with: request) { (data, response, error)
in
if let response = response {
print(response)
}
if let data = data {
let parseResult: NSDictionary!
do {
parseResult = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary
self.arrLocations = (parseResult.value(forKey: "InfoList"))as! NSArray
}catch {
print(error)
}
}
}.resume()
return self.arrLocations
}
}
现在我在另一个 swiftUI 文件中调用了上述函数
GetLocationData.swift
import SwiftUI
struct GetLocationData: View {
@State var arrloc = NSArray()
init() {
let g = GetLocations()
g.getLocNames(Action: "US", Id: "ba6fcd92-3d1e-4fb6-b135-0c47ea1815cd"){locationsarray in
self.arrloc = locationsarray
}
}
var body: some View {
VStack(spacing: 20){
Button(action: {},
label: {
Text("Select Menu"). //Here I need to assign the locationsarray I got from server and assign the valueof key to it (In obj-C we have [array objectAtIndex:0]objectForKey:@"Name"]].
I couldnt find the equivalent of it in swift
.frame(minWidth: 0, maxWidth: 500)
.padding()
.background(Color.clear)
.foregroundColor(Color.black)
.font(.custom("Open Sans", size: 18))
.overlay(
RoundedRectangle(cornerRadius: 10)
.stroke(Color.gray, lineWidth: 2)
)
})
}
}
init() 中的错误:Escaping closure captures mutating 'self' parameter
如何在视图加载之前解决它并获取数据并将数据分配给按钮文本?
【问题讨论】:
-
您的
getLocNames和getLocationsByAppId名称不匹配。除此之外,在getLocNames中,您正在返回一个值,而getLocationsByAppId似乎正在使用闭包。这些方法不同。 -
首先,不要在 Swift 中使用
NS...类。使用 swift 本机类型。其次,将您的数据移动到模型对象中。模型和视图的分离是 SwiftUI 中一个非常重要的概念。对数组使用@Published,您最初将有一个空数组,一旦填充数组,视图将自动重绘。 -
@George 我编辑了我的代码。实际上我更改了方法的名称,所以在发布 SO 名称时这样做是为了匹配。
-
@Paulw11 Published is already used 。请检查我的代码
-
您的 init() 缺少“}”,这是您的问题。