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



这就是它前后的样子。。

我有一个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的副本card传递到ForEach中,但如果我正确理解您的代码片段,它应该是原始数组cardData

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

我只是替换了文本上的CardForTimeline(因为我没有你的CardForTime(,它给我返回了2(我还替换了打印(cardData.count(上的打印(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)
]

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

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

而不是:CCD_ 5。这应该是有效的,因为您告诉SwiftUI,只要值发生变化,它就应该更新视图。

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

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

以上是使用local@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)
}
}

我希望这将帮助你解决你的问题

最新更新