Swift 如何像stackOverFlow一样增加/减少UpVote/DownVote?
我有这段代码,它允许用户像堆栈溢出一样进行向上投票或向下投票。我的问题是Swift 如何像stackOverFlow一样增加/减少UpVote/DownVote?,swift,firebase,google-cloud-firestore,swiftui,iosdeployment,Swift,Firebase,Google Cloud Firestore,Swiftui,Iosdeployment,我有这段代码,它允许用户像堆栈溢出一样进行向上投票或向下投票。我的问题是文本(“\(likes)UpVote”).padding(.top,8) 不会立即刷新,相反,用户应该更改透视图以获得刷新的upvote/downvote。 如何改进这一点,以便用户只需单击其中一个按钮一次,即可立即更改它们 我的代码是这样的: import SwiftUI import SDWebImageSwiftUI import Firebase struct PostCellCard : View {
文本(“\(likes)UpVote”).padding(.top,8)
不会立即刷新,相反,用户应该更改透视图以获得刷新的upvote/downvote。
如何改进这一点,以便用户只需单击其中一个按钮一次,即可立即更改它们
我的代码是这样的:
import SwiftUI
import SDWebImageSwiftUI
import Firebase
struct PostCellCard : View {
var user = ""
var image = ""
var id = ""
var likes = ""
var comments = ""
var msg = ""
var body : some View{
VStack(alignment: .leading, content: {
HStack{
Image("person-icon-1675").resizable().frame(width: 35, height: 35).clipShape(Circle()).onTapGesture {
print("slide out menu ....")
}
HStack(alignment: .top){
VStack(alignment: .leading){
Text(user).fontWeight(.heavy)
Text(msg).padding(.top, 8)
}}
Spacer()
Button(action: {
}) {
Image("menu").resizable().frame(width: 15, height: 15)
}.foregroundColor(Color("darkAndWhite"))
}
if self.image != ""{
AnimatedImage(url: URL(string: image)).resizable().frame(height: 250)
}
HStack{
Button(action: {
let db = Firestore.firestore()
let like = Int.init(self.likes)!
db.collection("posts").document(self.id).updateData(["likes": "\(like - 1)"]) { (err) in
if err != nil{
print((err)!)
return
}
print("down updated....")
}
}) {
Image(systemName: "arrow.down.to.line.alt").resizable().frame(width: 26, height: 26)
}.foregroundColor(Color("darkAndWhite"))
Button(action: {
let db = Firestore.firestore()
let like = Int.init(self.likes)!
db.collection("posts").document(self.id).updateData(["likes": "\(like + 1)"]) { (err) in
if err != nil{
print((err)!)
return
}
print("up updated....")
}
}) {
Image(systemName: "arrow.up.to.line.alt").resizable().frame(width: 26, height: 26)
}.foregroundColor(Color("darkAndWhite"))
Spacer()
}.padding(.top, 8)
Text("\(likes) UpVote").padding(.top, 8)
Text("\(likes) DownVote").padding(.top, 8)
Text("View all \(comments) Comments")
}).padding(8)
}
}
您将为
likes
变量使用一个属性包装器,因此当您更改likes的数量时,它也将在文本上更改它
在您的案例中应该使用的是@State
属性包装器,它看起来像这样
@State var likes = ""
关于属性包装器的更多信息,这里有一篇很好的文章解释它们
不幸的是,我不得不做了很多修改,以使它能够运行…这是我的代码,它可以工作-修改类似-当然,您可以将它改为int并增加它,而不仅仅是设置文本
struct ContentView : View {
var user = ""
var image = ""
var id = ""
@State var likes = ""
var comments = ""
var msg = ""
var body : some View{
VStack {
HStack{
Image(systemName:"circle").resizable().frame(width: 35, height: 35).clipShape(Circle()).onTapGesture {
print("slide out menu ....")
self.likes = "tapped"
}
HStack(alignment: .top){
VStack(alignment: .leading){
Text(user).fontWeight(.heavy)
Text(msg).padding(.top, 8)
}}
Spacer()
Button(action: {
self.likes = "aha"
}) {
Image(systemName:"circle").resizable().frame(width: 15, height: 15)
}.foregroundColor(Color("darkAndWhite"))
}
if self.image != ""{
Text("Animated Image")
// AnimatedImage(url: URL(string: image)).resizable().frame(height: 250)
}
HStack{
Button(action: {
self.likes = "oho"
print("button action")
}) {
Image(systemName: "circle").resizable().frame(width: 26, height: 26)
}.foregroundColor(Color("darkAndWhite"))
Button(action: {
let like = Int.init(self.likes)!
print("action")
self.likes = "uhu"
}) {
Text("aha")
// Image(systemName: "arrow.up.to.line.alt").resizable().frame(width: 26, height: 26)
}.foregroundColor(Color("darkAndWhite"))
Spacer()
}.padding(.top, 8)
Text("\(likes) UpVote").padding(.top, 8)
Text("\(likes) DownVote").padding(.top, 8)
Text("View all \(comments) Comments")
}.padding(8)
}
}
这没有帮助