2015-02-06 59 views
0

在我的應用程序中,我按下了按鈕,它使用iOS默認按鈕動畫更改了backgroundcolor和類似的數字。按鈕的默認行爲就像數字只能位於區間[x,x + 1]或[x-1,x]中,其中x是初始值。但是,如果按鈕被快速按下,相似的數字就會迅速增加或減少。當按下太快時,UIButton sender.titleLabel?.text?.toInt()不會提供更新值

func likeButtonAction(sender:UIButton!) { 
    var oldValue = sender.titleLabel?.text?.toInt() 
    println("oldvalue \(oldValue)") 
     if sender.selected { 
      //upvote 
      sender.setTitle(String(oldValue! + 1), forState: UIControlState.Normal|UIControlState.Selected) 
      println("inc \(oldValue! + 1)") 

     } else { 
      //downvote 
      sender.setTitle(String(oldValue! - 1), forState: UIControlState.Normal|UIControlState.Selected) 
      println("dec \(oldValue! - 1)") 
     } 
} 

EDIT1: 當按下迅速輸出:

oldvalue Optional(3) 
inc 4 
oldvalue Optional(4) 
dec 3 
oldvalue Optional(3) 
inc 4 
oldvalue Optional(4) 
dec 3 
oldvalue Optional(4) 
inc 5 
oldvalue Optional(5) 
dec 4 
oldvalue Optional(5) 
inc 6 
oldvalue Optional(6) 
dec 5 
oldvalue Optional(6) 
inc 7 
oldvalue Optional(7) 
dec 6 
oldvalue Optional(7) 
inc 8 
oldvalue Optional(8) 
dec 7 
oldvalue Optional(8) 
inc 9 
oldvalue Optional(9) 
dec 8 
oldvalue Optional(8) 
inc 9 

EDIT2: SOLUTION: 這個工作正常,但我不知道爲什麼。解釋將不勝感激

func likeButtonAction(sender:UIButton!) 
     if sender.selected { 
      //upvote 
      sender.setTitle(String((sender.titleLabel?.text?.toInt())! + 1), forState: UIControlState.Normal|UIControlState.Selected) 
     } else { 
      //downvote 
      sender.setTitle(String((sender.titleLabel?.text?.toInt())! - 1), forState: UIControlState.Normal|UIControlState.Selected) 
     } 
} 

回答

1

這是行不通的,因爲

if sender.backgroundImageForState(UIControlState.Normal) == UIImage(named: "like.png") 

永遠是假的..

的UIImage(命名爲: 「like.png」)

將創建新的UIImage實例。

您可以將「標記」分配給任何視圖(在本例中爲UIButton)來處理這種情況。

+0

改變了這種方式,但問題仍然存在。所以我的假設是錯誤的我會編輯 – Thellimist 2015-02-06 15:18:27

1

我的建議是將按鈕狀態設置爲.Normal和。分別選擇爲「like.png」和「liked.png」。然後你的代碼可以是簡單的:

func likeButtonAction(sender:UIButton!) { 
     if sender.selected { 
      //upvote 
      sender.setTitle(String(oldValue! + 1), forState: UIControlState.Normal) 
      sender.setTitleColor(MyStyle.ThemeSecondColor, forState: UIControlState.Normal) 
     } else { 
      //downvote 
      sender.setTitle(String(oldValue! - 1), forState: UIControlState.Normal) 
      sender.setTitleColor(MyStyle.ThemeColor, forState: UIControlState.Normal) 
     } 
     //Quickly flip the button state to the opposite of what it was 
     sender.selected = !sender.selected 
} 

編輯:

嗯,你可以實現一個變量來保存「計數」,並設置第一,然後設置與按鈕的值即,不是進出按鈕標題的拉動值:

var likeCount:Int = [SET THIS FROM YOUR STORAGE] || 0 
func likeButtonAction(sender:UIButton!) { 
    if sender.selected { 
     //upvote 
     likeCount++ 
     println("inc \(likeCount!)") 

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

這將保持獨立價值的跟蹤,並從潛在的阻礙了進程保持UI。

+0

謝謝,但它沒有奏效。快速按下時,數字仍不準確。 – Thellimist 2015-02-06 15:06:54

+0

我的假設是錯誤的。問題重新編輯。 – Thellimist 2015-02-06 15:38:15

相關問題