最近的一个SwiftUI 项目需要从服务器获取可选语言列表然后通过表单的Picker进行选择,代码如下:
语言结构:
import Foundation
import SwiftUI
import HandyJSON
//语言
struct Language :Hashable, Codable,Identifiable, HandyJSON {
var id = UUID()
var name:String!
var code:String!
}
表单
//选择目标
@State var target:String = ""
//所有可选语言
@State var languages:[Language] = []
Section{
Picker(selection: $target, label:
HStack{
RoundedRectangle(cornerRadius: 8)
.overlay(
Image(systemName: "globe")
.foregroundColor(.white)
)
.frame(width: 40,height: 40,alignment: .center)
.foregroundColor(.green)
Text("Language")
}
) {
ForEach(languages) { language in
Text(language.name).tag(language.code)
}
}.padding(.vertical)
}
通过表单onAppear呈现时,发起网络请求,解析可选语言列表到动态数组 languages 中,Picker能马上显示可选列表,但不能进行选择,点击选择不会返回表单,图片如下(没有打勾)
按道理说,点击picker中的某一项之后,对应Text的tag的值会赋值到目标target 变量。
我通过打印临时变量的方式发现此时的Tag中的值不是String类型的,而是Optional类型,这下就容易解决了,如下把Tag中的值加一层转换:
ForEach(languages) { language in
Text(language.name).tag(String(language.code))
}