0

私のアプリケーションでは、ボタンを押すと、iOS のデフォルトのボタン アニメーションで backgroundcolor などの番号が変更されます。ボタンのデフォルトの動作は、数値が [x, x+1] または [x-1, x] の間隔でのみ指定できるようになっています。ここで、x は初期値です。しかし、ボタンをすばやく押すと、同様の数が急速に増加するか、急速に減少します。

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: 解決策: これは正常に動作しますが、理由がわかりません。説明をいただければ幸いです

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)
        }
}
4

2 に答える 2

1

これは機能しません

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

常に偽です..

UIImage(名前:「like.png」)

新しい UIImage インスタンスを作成します。

このような場合を処理するために、任意のビュー (この場合は UIButton) に「タグ」を割り当てることができます。

于 2015-02-06T14:44:21.523 に答える
1

私の提案は、.Normal と .Selected のボタンの状態をそれぞれ「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 がプロセスを潜在的に停止することがなくなります。

于 2015-02-06T14:57:19.393 に答える