【问题标题】:Cannot manually set the highlighted state of a UIButton in an IBAction method无法在 IBAction 方法中手动设置 UIButton 的突出显示状态
【发布时间】:2015-02-18 17:02:51
【问题描述】:

在我的ViewController 中,我有两个 IBOutlets signUpButtonmemberButton,并且两个按钮都链接到相同的 signUpOrMemberButtonPressed() IBAction 函数。我正在尝试将highlighted 属性设置为这两个按钮,以便我可以在submitPressed() IBAction 函数中相应地进行后续工作。但我注意到signUpOrMemberButtonPressed()submitPressed() IBActions 之间的奇怪行为。在点击signUpButtonmemberButton 后,该按钮在我的signUpOrMemberButtonPressed() 中突出显示,但是当它执行submitPressed() 时,调试显示它没有突出显示。这是我的signUpOrMemberButtonPressed()

@IBAction func signUpOrMemberButtonPressed(sender: AnyObject) {
    var button = sender as UIButton
    button.highlighted = true
    if signUpButton.highlighted {
        memberButton.highlighted = false
    } else {
        signUpButton.highlighted = false
    }

    if (signUpButton.highlighted) {
        println("signUpButton is highlighted inside 1st button")
    } else if (memberButton.highlighted) {
        println("memberButton is highlighted inside 1st button")
    } else {
        println("nothing is highlighted inside 1st button")
    }
}

我的submitPressed 功能:

@IBAction func submitPressed(sender: AnyObject) {
    if (signUpButton.highlighted) { println("signUpButton is highlighted inside 2st button") }
    else if (memberButton.highlighted) { println("memberButton is highlighted inside 2st button") }
    else { println("nothing is highlighted inside 2nd button")
}

运行我的应用程序时,我点击了memberButton,然后点击了提交按钮。这是日志输出:

memberButton is highlighted inside 1st button
nothing is highlighted inside 2nd button

这两个函数调用之间没有设置任何运行。

【问题讨论】:

    标签: swift ios8 uibutton ibaction iboutlet


    【解决方案1】:

    这里发生的是按钮本身“取消突出显示”(在您手动设置 highlight = true 之后)。

    来自highlighted 属性的documentation

    UIControl 自动设置并自动清除此状态 在跟踪期间以及进行触摸时,触摸进入和退出。

    您可以手动设置突出显示状态,但您必须在 UIButton 取消设置突出显示状态后执行此操作。您必须在下一个运行循环中执行此操作,您可以使用 dispatch_async 执行此操作。

    以下应该有效:

    var button = sender as UIButton
    dispatch_async(dispatch_get_main_queue()) {
        self.memberButton.highlighted = button == self.memberButton
        self.signUpButton.highlighted = button == self.signUpButton
    }
    

    【讨论】:

    • 很高兴知道这个highlighted 属性在用户点击后自动取消设置的行为。我猜自动取消设置发生在mysignUpOrMemberButtonPressed() 之后?我不明白dispatch_async(dispatch_get_main_queue()) 究竟是如何工作的......当它尝试在主队列中再次设置highlighted 属性时,代码如何知道这个highlighted 属性已经自动取消设置?另外,为什么代码不会在 dispatch_async 块内第二次自动取消设置相同的属性?
    • dispatch_async 调用基本上会导致dispatch_async 调用中的代码在其他所有操作完成后运行。如果您在 dispatch_async 调用中放置一个断点,并在其后放置一个断点,您将看到后面的断点首先被命中,然后在 dispatch_async 调用中的断点随后被命中。
    • 查看按钮的selected 属性(而不是highlighted)是否适合您。如果您想显示按钮处于选定状态并且您不会遇到此问题,那么实际上应该使用该属性。它在视觉上看起来会略有不同,所以请尝试一下。
    • 我试用了你的代码。结果很好。我将我的设计更改为不使用highlighted 属性,只是为了避免发生意外的事情,并为相同的功能添加了一个用于注册或登录的布尔值。这对我来说也很好。感谢dispatch_async的解释
    猜你喜欢
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多