0

在我的应用程序中,我按下按钮,它会使用 iOS 默认按钮动画更改背景颜色等数字。按钮的默认行为就像 number 只能在区间 [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 回答