Перебор элементов массива по очереди через кнопку
Есть класс, с вычисляемым свойством, которое состоит из экземпляров структуры.
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
}
}
}
}
Так же есть view, в котором можно добавлять элементы(команды) с помощью sheet.
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)
}
}
}
Это sheet view, которые вызывается в PlayersRow.
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()
}) {
Text("Сохранить")
.font(.custom("coolJazz", size: 20))
.foregroundColor(.black)
})
.navigationBarTitle("Add Team")
}
}
}
Так же есть view, где мне нужно выводить элементы на экран по очередно, с помощью кнопки, нажал на кнопку, на экране 0 элемент, нажал на кнопку, 1 элемент, итд
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())
}
}
Ответы (1 шт):
Автор решения: Milez
→ Ссылка
Необходимо внести данные изменение в GameView.
struct GameView: View {
@ObservedObject var teams = TeamRow()
@State var index = 0
var body: some View {
VStack(spacing: 40) {
if teams.teamsArray.count > index {
Text(teams.teamsArray[index].name)
}
Button(action: {
index += 1
if teams.teamsArray.count == index {
index = 0
}
}) {
Text("press it")
}
}
}
}
Так же можно action в кнопке вынести в отдельный метод
func increaseIndexAndReset() {
index += 1
if teams.teamsArray.count == index {
index = 0
}
}