将元素附加到数组后,它应该显示更多元素

Posted

技术标签:

【中文标题】将元素附加到数组后,它应该显示更多元素【英文标题】:After appending element to array it should show more elements 【发布时间】:2020-08-22 14:40:35 【问题描述】:

This is how it looks before and after..

我有一个 ForEach 循环,当我点击卡片时,它会在数组中附加一个新元素,然后它应该显示 2 张卡片。 但是还有一张卡。 (但我附加了新的卡片元素) 那我该怎么办?

struct TimelineFromUserView: View 
    
    var card: [Card] = cardData
    
    var body: some View 
        
        VStack 
            HStack 
                Text("History").bold()
                    .font(.largeTitle)
                    .padding(.top, 20)
                    .padding(.leading, 20)
                Spacer()
                
            
            Divider()
            ScrollView(.vertical, showsIndicators: false) 
                
                VStack(spacing: 30) 
                    ForEach(card)  item in
                        CardForTimeline(card: item)
                            .onTapGesture 
                                    print("juhuu")
                                    cardData.append(Card(number: 2, start: "01.10.2021", end: "20.10.2021", days: 19, success: false))
                                    print(cardData)
                            
                        .padding()
                    
                
                .padding(.top, 10)
            
        
    


struct Card: Identifiable
    
    var id = UUID()
    var number: Int
    var start: String
    var end: String
    var days: Int
    var success: Bool


var cardData: [Card] = [
    Card(number: 1 ,start: "05.06.2020", end: "15.06.2020", days: 10, success: true)
]

【问题讨论】:

您是否会显示完整的视图变体,因为不清楚您如何存储和更新卡片? 就是这样。我没有更多代码。 问题是cardData不是@State变量。 @matt 所说的内容,加上您在ForEach() 中使用的名为cardcardData 的副本,但您要附加到cardData 的原始版本。数组是 Swift 中的值类型,因此您在复制后对 cardData 所做的操作不会反映在复制中。 谢谢!你知道如何将 cardData 保存到 UserDefaults 吗? 【参考方案1】:

您只需将数组cardData 的副本card 传递给ForEach,但如果我正确理解您的代码sn-ps,它应该是原始数组cardData

如果这不是问题,发布更多代码会有所帮助。

【讨论】:

【参考方案2】:

我只是替换了 Text 上的 CardForTimeline(因为我没有您的 CardForTimeline),它返回了 2(我也替换了 print(cardData.count) 上的 print(cardData))。您可以创建全新的项目并添加此代码。点击后会打印2、3、4、5

struct ContentView: View 
    
    var card: [Card] = cardData
    
    var body: some View 
        
        VStack 
            HStack 
                Text("History").bold()
                    .font(.largeTitle)
                    .padding(.top, 20)
                    .padding(.leading, 20)
                Spacer()
                
            
            Divider()
            ScrollView(.vertical, showsIndicators: false) 
                
                VStack(spacing: 30) 
                    ForEach(card)  item in
                        Text(verbatim: "we")
                            .onTapGesture 
                                    print("juhuu")
                                    cardData.append(Card(number: 2, start: "01.10.2021", end: "20.10.2021", days: 19, success: false))
                                print(cardData.count)
                            
                        .padding()
                    
                
                .padding(.top, 10)
            
        
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    



struct Card: Identifiable
    
    var id = UUID()
    var number: Int
    var start: String
    var end: String
    var days: Int
    var success: Bool


var cardData: [Card] = [
    Card(number: 1 ,start: "05.06.2020", end: "15.06.2020", days: 10, success: true)
]

【讨论】:

【参考方案3】:

问题是 SwiftUI 不知道更新视图。试着写

@State private var card: [Card] = [
    Card(number: 1 ,start: "05.06.2020", end: "15.06.2020", days: 10, success: true)
]

而不是: var card: [Card] = cardData。 这应该可以工作,因为你告诉 SwiftUI 它应该在值更改时更新视图。

此外,您还必须将代码的添加部分更改为:

.onTapGesture 
   self.card.append(Card(number: 2, start: "01.10.2021", end: "20.10.2021", days: 19, success: false))

以上是一种使用本地@State 属性来管理状态的方法。您也可以使用带有卡片数组的可观察对象。这可能如下所示:

struct ContentView: View 
    @ObservedObject private var cardData = CardData()
    
    var body: some View 
        
        VStack 
            HStack 
                Text("History").bold()
                    .font(.largeTitle)
                    .padding(.top, 20)
                    .padding(.leading, 20)
                Spacer()
                
            
            Divider()
            ScrollView(.vertical, showsIndicators: false) 
                
                VStack(spacing: 30) 
                    ForEach(cardData.cards)  card in
                        Text(card.id.uuidString)
                            .onTapGesture 
                                self.cardData.add(card: Card(number: 2, start: "01.10.2021", end: "20.10.2021", days: 19, success: false))
                            
                        .padding()
                    
                
                .padding(.top, 10)
            
        
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    



struct Card: Identifiable
    var id = UUID()
    var number: Int
    var start: String
    var end: String
    var days: Int
    var success: Bool


class CardData: ObservableObject 
    // store the cards and make sure its get-only from the outside
    @Published private(set) var cards = [
        Card(number: 1 ,start: "05.06.2020", end: "15.06.2020", days: 10, success: true)
    ]
    
    // MARK: - Intents for modifing the cards, add additional if needed
    
    func add(card: Card) 
        self.cards.append(card)
    

希望对您的问题有所帮助

【讨论】:

以上是关于将元素附加到数组后,它应该显示更多元素的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL:仅当元素唯一时才将元素附加到 jsonb 数组

Scala:将元素附加到数组的最佳方法是啥?

将元素作为兄弟元素附加在元素之后? [复制]

使用 postgres 9.4 将 JSON 元素附加到数组

如何将数组元素附加到div?

如何出于 JSON 原因将元素附加到 C# 数组?