【问题标题】:Problems with switching array elements切换数组元素的问题
【发布时间】: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())
    }
}

如果数组最初是在类中设置的,我通过增加索引在屏幕上显示元素是没有问题的,但是如何解决这个问题我不知道...

有人能解释一下新手吗?

【问题讨论】:

  • 具体解决什么问题,我不确定我明白你在问什么?

标签: arrays swift swiftui


【解决方案1】:

将您的 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
            }) {
                Text("press it")
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2015-04-02
    • 1970-01-01
    相关资源
    最近更新 更多