2015-10-27 15 views
-3

我在做一個應用程序,用戶可以發佈/評論/和喜歡的職位。我想實施類似於YouTube的贊成/反對。我currenlty有兩個IBActions喜歡和不喜歡的按鈕。我的問題是,如何在選擇另一個按鈕時取消選擇按鈕並減小/增加每個按鈕的值?反之亦然?這是下面的代碼。大拇指向下 - YouTube的風格投票系統,其中用戶只能投票一次,但可以從喜歡變成喜歡反之亦然

@IBAction func dislikeButton(sender: UIButton) { 



    let selected: Bool = !sender.selected 

    var likeCount: Int = Int((sender.titleLabel?.text)!)! 

    if selected { 
     //upvote 
     likeCount++ 
     print("inc \(likeCount)") 

    } else { 
     //downvote, but do not allow negative values 
     if likeCount == 0{ 
      likeCount = 0 
     } else { 
      likeCount-- 
     } 
     print("dec \(likeCount)") 
    } 
    sender.setTitle(String(likeCount), forState: UIControlState.Normal) 
    sender.selected = !sender.selected 


} 





@IBAction func likeButton(sender: UIButton) { 

    let selected: Bool = !sender.selected 

    var dislikeCount: Int = Int((sender.titleLabel?.text)!)! 

    if selected { 

     //upvote 
     dislikeCount++ 
     print("inc \(dislikeCount)") 

    } else { 
     //downvote, but do not allow negative values 
     if dislikeCount == 0{ 
      dislikeCount = 0 
     } else { 
      dislikeCount-- 
     } 
     print("dec \(dislikeCount)") 
    } 
    sender.setTitle(String(dislikeCount), forState: UIControlState.Normal) 
    sender.selected = !sender.selected 

} 

回答

1

它通常是更好的設計到模型從視圖中分離出來。也就是說,更好的設計(在你的情況下)存儲用戶的投票(像/ dislike/none),而投票直接計數,而不是隱式地作爲按鈕狀態和標籤。

class VotableItem { 

    // Votes: -1 for dislike, 1 for like, 0 for no vote 
    var vote: Int = 0 // initialize to user's existing vote, retrieved from the server 
    var likeCount: Int = 0 // initialize to existing like count, retrieved from the server 
    var dislikeCount: Int = 0 // initialize to existing dislike count, retrieved from the server 

您還需要連接到喜歡和討厭按鈕網點,更新它們:

@IBOutlet var likeButton: UIButton! 
    @IBOutlet var dislikeButton: UIButton! 

當用戶點擊了Like按鈕,有兩種可能的行動。如果現有的投票是「喜歡」(存儲爲1),她想撤消她的「喜歡」投票並將其投票回覆爲「無」(存儲爲0)。否則,現有的投票是「無」或「不喜歡」(存儲爲-1),她想撤消她現有的投票並將其投票爲「喜歡」。

類似地,當用戶點擊按鈕不喜歡,有兩種可能的動作。如果她現有的投票「不喜歡」,她想撤消它,將其設置爲「無」。否則,她想撤銷她現有的「喜歡」或「無」投票,並將她的投票設定爲「不喜歡」。

注意,撤消「無」投票沒有任何影響,但邏輯是簡單的,如果我們允許撤消它(什麼都不做)。

由於喜歡和討厭按鈕的動作是如此的相似,我們可以分解出共同的行爲。按鈕連接到這些操作:

@IBAction func dislikeButtonWasClicked(sender: UIButton) { 
     buttonWasClickedForVote(-1) 
    } 

    @IBAction func likeButtonWasClicked(sender: UIButton) { 
     buttonWasClickedForVote(1) 
    } 

然後實現buttonWasClickedForVote(_:)功能:

private func buttonWasClickedForVote(buttonVote: Int) { 
     if buttonVote == vote { 
      // User wants to undo her existing vote. 
      applyChange(-1, toCountForVote: vote) 
      vote = 0 
     } 

     else { 
      // User wants to force vote to toggledVote. 
      // Undo current vote, if any. 
      applyChange(-1, toCountForVote: vote) 
      // Apply new vote. 
      vote = buttonVote 
      applyChange(1, toCountForVote: vote) 
     } 

     updateUserInterfaceFromModel() 
    } 

我使用一個輔助函數來更新計數。需要注意的是它什麼都不做,如果票爲0(意爲「無」):

private func applyChange(change: Int, toCountForVote vote: Int) { 
     if vote == -1 { dislikeCount += change } 
     else if vote == 1 { likeCount += change } 
    } 

我們需要另一種功能,使用戶界面狀態的匹配模型:

private func updateUserInterfaceFromModel() { 
     likeButton.selected = vote == 1 
     likeButton.setTitle("\(likeCount)", forState: .Normal) 
     dislikeButton.selected = vote == -1 
     dislikeButton.setTitle("\(dislikeCount)", forState: .Normal) 
    } 

注意,updateUserInterfaceFromModel功能不依賴於用戶界面的當前狀態。這意味着您也可以在初始化過程中使用它。只需設置vote,likeCountdislikeCount(推測基於服務器的數據)。然後,在viewDidLoad中,請撥打updateUserInterfaceFromModel

+0

嘿真的很感謝答案!我如何將它存儲在Parse數據庫中? –

+0

您需要閱讀Parse文檔,也可以按照Parse教程來學習API。 –

+0

謝謝。我嘗試了你的代碼,但在這裏得到一個錯誤:最後一個函數:func updateUserInterfaceFrommodel()..即時通訊獲取致命錯誤:意外發現零將解開一個可選值...幫助表示讚賞! –