首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >投票:两次投票登记

投票:两次投票登记
EN

Stack Overflow用户
提问于 2019-08-13 11:27:22
回答 1查看 102关注 0票数 0

我正在制定一个投票制度。但是,当你向上投票,然后删除向上投票,分数上升了一个,然后下降了两个。如果你想投反对票,比分根本不会移动。我认为代码将删除向上的选票记录为一次否决,但我不知道为什么。改变你的选票,就能达到预期的2分。除非你投得好,否则离开viewController,然后改变你的投票。这只会给你1分的改变。

代码语言:javascript
复制
    @IBOutlet weak var checkbox: Checkbox!
    @IBOutlet weak var downVote: Checkbox!
    var boxcheck = false
    var downcheck = false
    var postRef:DatabaseReference{
    return Database.database().reference().child("posts").child("comments")}
 }
      func set(comment:Comment) {
    commentLabel.text = comment.text
    upvoteCountLabel.text = String(comment.upvotes)
    downcheck = UserDefaults.standard.bool(forKey: "\(comment.snap) downvotes")
    boxcheck = UserDefaults.standard.bool(forKey: "\(comment.snap) upvotes")
    downVote.isChecked = UserDefaults.standard.bool(forKey: "\(comment.snap) downvotes")
    checkbox.isChecked = UserDefaults.standard.bool(forKey: "\(comment.snap) upvotes")

    downcheck = UserDefaults.standard.bool(forKey: "\(comment.snap) downvotes")
    boxcheck = UserDefaults.standard.bool(forKey: "\(comment.snap) upvotes")
    func voteUp() {
        self.postRef.child(comment.postID).child(comment.snap).child("upvotes").runTransactionBlock({ (currentData:MutableData)  -> TransactionResult in
            if (currentData.value as? [String: AnyObject]) == nil {

                let upvotesNumber = comment.upvotes
                var upvotes = upvotesNumber
                upvotes += 1

                currentData.value = upvotes

                return TransactionResult.success(withValue: currentData)
            }

            //Abort like if there was a problem
            print("abortion")
            return TransactionResult.abort()

        })

    }
  func voteDown(){
        self.postRef.child(comment.postID).child(comment.snap).child("upvotes").runTransactionBlock({ (currentData:MutableData)  -> TransactionResult in
            if (currentData.value as? [String: AnyObject]) == nil {

                let upvotesNumber = comment.upvotes
                var upvotes = upvotesNumber
                upvotes -= 1

                currentData.value = upvotes

                return TransactionResult.success(withValue: currentData)
            }

            //Abort like if there was a problem
            print("abortion")
            return TransactionResult.abort()

        })
    }

    checkbox.valueChanged = { (value) in
        print("checkbox value change: \(value)")

      self.boxcheck = self.checkbox.isChecked
        UserDefaults.standard.set(self.checkbox.isChecked, forKey: "\(comment.snap) upvotes")
        UserDefaults.standard.set(self.downVote.isChecked, forKey: "\(comment.snap) downvotes")
        if self.checkbox.isChecked == true && self.downVote.isChecked == true{
            voteUp()
            self.boxcheck = self.checkbox.isChecked
        }
        if self.checkbox.isChecked == true && self.downVote.isChecked == false{

        UserDefaults.standard.set(self.checkbox.isChecked, forKey: "\(comment.snap) upvotes")
        UserDefaults.standard.set(self.downVote.isChecked, forKey: "\(comment.snap) downvotes")

            voteUp()
            self.boxcheck = self.checkbox.isChecked
        }

       if self.checkbox.isChecked == false && self.downVote.isChecked == false{
        UserDefaults.standard.set(self.checkbox.isChecked, forKey: "\(comment.snap) upvotes")
        UserDefaults.standard.set(self.downVote.isChecked, forKey: "\(comment.snap) downvotes")

           voteDown()
        self.downVote.isChecked = false
        self.boxcheck = self.checkbox.isChecked
        self.downcheck = self.downVote.isChecked
        }

       if self.checkbox.isChecked == false && self.downVote.isChecked == true{
           voteDown()
        self.boxcheck = self.checkbox.isChecked
        }
            if self.downVote.isChecked == true && self.checkbox.isChecked == true {
            self.downVote.isChecked = false
            self.downcheck = self.downVote.isChecked
            }

        print("POSTITIVE My current downcheck value is \(self.downcheck)")
        print("POSITIVE My current upcheck value is \(self.boxcheck)")
        UserDefaults.standard.set(self.checkbox.isChecked, forKey: "\(comment.snap) upvotes")
        UserDefaults.standard.set(self.downVote.isChecked, forKey: "\(comment.snap) downvotes")
    }


    downVote.valueChanged = { (value) in
        self.downcheck = self.downVote.isChecked
        print("downVote value change: \(value)")
        UserDefaults.standard.set(self.checkbox.isChecked, forKey: "\(comment.snap) upvotes")
        UserDefaults.standard.set(self.downVote.isChecked, forKey: "\(comment.snap) downvotes")
        if self.checkbox.isChecked == true && self.downVote.isChecked == true {
            voteDown()
            self.downcheck = self.downVote.isChecked

        }
        if self.checkbox.isChecked == false && self.downVote.isChecked == true {

        UserDefaults.standard.set(self.checkbox.isChecked, forKey: "\(comment.snap) upvotes")
        UserDefaults.standard.set(self.downVote.isChecked, forKey: "\(comment.snap) downvotes")

            voteDown()
            self.downcheck = self.downVote.isChecked
        }

        if self.checkbox.isChecked == false && self.downVote.isChecked == false{
        UserDefaults.standard.set(self.checkbox.isChecked, forKey: "\(comment.snap) upvotes")
        UserDefaults.standard.set(self.downVote.isChecked, forKey: "\(comment.snap) downvotes")
           voteUp()
            self.downcheck = self.downVote.isChecked
            self.boxcheck = self.checkbox.isChecked
        }
     if self.checkbox.isChecked == true && self.downVote.isChecked == false   {
        UserDefaults.standard.set(self.checkbox.isChecked, forKey: "\(comment.snap) upvotes")
        UserDefaults.standard.set(self.downVote.isChecked, forKey: "\(comment.snap) downvotes")
                voteUp()
        self.downcheck = self.downVote.isChecked
            }

            if self.checkbox.isChecked == true && self.downVote.isChecked == true {
            self.checkbox.isChecked = false
            self.boxcheck = self.checkbox.isChecked
        }
        UserDefaults.standard.set(self.checkbox.isChecked, forKey: "\(comment.snap) upvotes")
        UserDefaults.standard.set(self.downVote.isChecked, forKey: "\(comment.snap) downvotes")
    }
    print("My current downcheck value is \(self.downcheck)")
    print("My current upcheck value is \(self.boxcheck)")
}


}

Firebasse引用可以正常工作,但这里是我的注释模型,以防您好奇:

代码语言:javascript
复制
import Foundation

class Comment: Equatable {
static func == (lhs: Comment, rhs: Comment) -> Bool {
    return lhs.id == rhs.id
}


var snap:String
var id:String
var text:String
var reports: Int
var upvotes: Int
var postID: String
init(id: String, text:String, reports:Int, snap: String, upvotes: Int, postID: String) {
    self.id = id
    self.text = text
    self.reports = reports
    self.snap = snap
    self.upvotes = upvotes
    self.postID = postID
}

和Firebase JSON:

代码语言:javascript
复制
   {
  "posts" : {
    "-Lku3osQQXgagYMVI9ua" : {
      "commentsNumber" : 2,
      "reports" : 1,
      "text" : "Hey",
      "timestamp" : 1564342439656,
      "title" : "Welcome to Librex",
      "upvotes" : 1,
      "userID" : "mMqFhoNiR3gWiTd7J4wtPABhtYB3"
    }
    "comments" : {
      "-Lku3osQQXgagYMVI9ua" : {
        "-LlcJ_6Kus1nuqaCk17R" : {
          "comment_by_uid" : "N3HNT1aVkPXhiCRu9fzJknWYxCt2",
          "comment_text" : "This is really cool; thanks!",
          "reports" : 0,
          "upvotes" : 3
        },
        "-Llhr2E7UodiuyvzeGMi" : {
          "comment_by_uid" : "N3HNT1aVkPXhiCRu9fzJknWYxCt2",
          "comment_text" : "K ",
          "reports" : 0,
          "upvotes" : 1

          }
        }
       }
     }
   }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-14 23:40:20

这是我用来投票的代码!

代码语言:javascript
复制
 func voteUp() {
        self.postRef.child(comment.postID).child(comment.snap).child("upvotes").runTransactionBlock({
            (currentData: MutableData!) in

            //value of the counter before an update
            var value = currentData.value as? Int

            //checking for nil data is very important when using
            //transactional writes
            if value == nil {
                value = 0
            }

            //actual update
            currentData.value = value! + 1
            UserDefaults.standard.set(self.checkbox.isChecked, forKey: "\(comment.snap) upvotes")
            UserDefaults.standard.set(self.downVote.isChecked, forKey: "\(comment.snap) downvotes")
            return TransactionResult.success(withValue: currentData)

        }, andCompletionBlock: {
            error, commited, snap in

            //if the transaction was commited, i.e. the data
            //under snap variable has the value of the counter after
            //updates are done
            if commited {
                let upvotes = snap?.value as! Int

            } else {
                UserDefaults.standard.set(self.checkbox.isChecked, forKey: "\(comment.snap) upvotes")
                UserDefaults.standard.set(self.downVote.isChecked, forKey: "\(comment.snap) downvotes")
                TransactionResult.abort()
            }
        })

    }

  func voteDown(){
    self.postRef.child(comment.postID).child(comment.snap).child("upvotes").runTransactionBlock({
        (currentData: MutableData!) in

        //value of the counter before an update
        var value = currentData.value as? Int
        UserDefaults.standard.set(self.checkbox.isChecked, forKey: "\(comment.snap) upvotes")
        UserDefaults.standard.set(self.downVote.isChecked, forKey: "\(comment.snap) downvotes")
        //checking for nil data is very important when using
        //transactional writes
        if value == nil {
            value = 0
            UserDefaults.standard.set(self.checkbox.isChecked, forKey: "\(comment.snap) upvotes")
            UserDefaults.standard.set(self.downVote.isChecked, forKey: "\(comment.snap) downvotes")
        }

        //actual update
        UserDefaults.standard.set(self.checkbox.isChecked, forKey: "\(comment.snap) upvotes")
        UserDefaults.standard.set(self.downVote.isChecked, forKey: "\(comment.snap) downvotes")
        currentData.value = value! - 1
        return TransactionResult.success(withValue: currentData)
    }, andCompletionBlock: {
        error, commited, snap in

        //if the transaction was commited, i.e. the data
        //under snap variable has the value of the counter after
        //updates are done
        if commited {
            let upvotes = snap?.value as! Int
            UserDefaults.standard.set(self.checkbox.isChecked, forKey: "\(comment.snap) upvotes")
            UserDefaults.standard.set(self.downVote.isChecked, forKey: "\(comment.snap) downvotes")
        } else {

            TransactionResult.abort()
            UserDefaults.standard.set(self.checkbox.isChecked, forKey: "\(comment.snap) upvotes")
            UserDefaults.standard.set(self.downVote.isChecked, forKey: "\(comment.snap) downvotes")
        }
    })

    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57476801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档