【发布时间】:2021-03-13 09:54:52
【问题描述】:
我有一个具有计算属性的类,它是一个由结构实例组成的数组。
struct Team: Identifiable, Codable, Hashable {
var id = UUID()
var name : String
}
class TeamRow : ObservableObject {
@Published var teamsArray : [Team] = [] {
didSet {
let encoder = JSONEncoder()
if let encoded = try? encoder.encode(teamsArray) {
UserDefaults.standard.setValue(encoded, forKey: "Teams")
}
}
}
init() {
if let teams = UserDefaults.standard.data(forKey: "Teams") {
let decoder = JSONDecoder()
if let decoded = try? decoder.decode([Team].self, from: teams) {
self.teamsArray = decoded
return
}
}
}
}
另外,我有一个视图,能够使用工作表将元素(团队)添加到此数组。
struct PlayersRow: View {
@ObservedObject var teams = TeamRow()
@State private var team = ""
@State private var showTeamAddSheet = false
var body: some View {
Form {
ForEach(teams.teamsArray) { team in
Text(team.name)
.font(.system(size: 20))
.padding(.horizontal, 110)
.padding(.vertical, 10)
}
}
.navigationBarTitle("Teams")
.navigationBarItems(trailing: Button(action: {
self.showTeamAddSheet = true
}) {
Image(systemName: "plus")
.foregroundColor(.black)
.font(.system(size: 30))
})
.sheet(isPresented: $showTeamAddSheet) {
AddPlayerView(teams: self.teams)
}
}
}
这是一个工作表视图。
struct AddPlayerView: View {
@Environment(\.presentationMode) var presentationMode
@ObservedObject var teams : TeamRow
@State private var team = ""
var body: some View {
NavigationView {
Form {
TextField("Add new team", text: $team)
}
.navigationBarItems(trailing: Button(action: {
let newTeam = Team(name: self.team)
self.teams.teamsArray.append(newTeam)
self.presentationMode.wrappedValue.dismiss()
}, label: {
Text("Сохранить")
.font(.custom("coolJazz", size: 20))
.foregroundColor(.black)
}))
.navigationBarTitle("Add Team")
}
}
}
而且我有一个视图需要一个一个的输出数组元素,使用按钮,点击按钮,视图屏幕显示0元素,点击按钮,显示第一个元素等
struct GameView: View {
@ObservedObject var teams = TeamRow()
//@State var index = 0
var body: some View {
VStack(spacing: 40) {
//Text(teams.teamsArray[index]) this isn't worked, return an error: Initializer 'init(_:)' requires that 'Team' conform to 'StringProtocol'
Button(action: {
}) {
Text("press it")
}
}
}
}
struct GameView_Previews: PreviewProvider {
static var previews: some View {
GameView().environmentObject(TeamRow())
}
}
如果数组最初是在类中设置的,我通过增加索引在屏幕上显示元素是没有问题的,但是如何解决这个问题我不知道...
有人能解释一下新手吗?
【问题讨论】:
-
具体解决什么问题,我不确定我明白你在问什么?