【问题标题】:How to change button repeatedly when tapped?点击时如何重复更改按钮?
【发布时间】:2015-07-11 03:24:58
【问题描述】:

使用 Swift,我如何制作:

  1. 带有“开始”字样的按钮,在点击时会变为“暂停”,反之亦然?不只是一次,而是可以无限做? (例如在秒表应用中)
  2. 点击时可在 2 张图片之间切换的自定义图片按钮,也可以无限进行(点击和更改)?

【问题讨论】:

  • 编辑您的帖子并向我们展示您到目前为止所做的工作。
  • 我只是随便玩弄按钮.. 没有什么有趣的表现!然而!哈哈!

标签: ios xcode swift button


【解决方案1】:

第 1 步:创建一个 Bool 变量

var isPlaying:Bool = false

第 2 步:使用此 IBAction 方法连接您的按钮:

@IBAction func btnStartStop(sender: UIButton) {
    if isPlaying{

        isPlaying = false
        sender.setTitle("Pause", forState: UIControlState.Normal)
        sender.setImage(pauseImage, forState: .Normal)
        //Pause Stopwatch
    }
    else{

        isPlaying = true
        sender.setTitle("Play", forState: UIControlState.Normal)
        sender.setImage(playImage, forState: .Normal)
      //Play Stopwatch
    }
  }

【讨论】:

  • 根据我下面的评论,您不应该使用按钮标题作为您的状态测试:例如,如果应用程序被翻译成另一种语言会发生什么?或者按钮标题从 Play 变为 Start。如有必要,请使用 Bool 来存储状态。
  • 然后在 Title String 的地方使用 Localized string。
  • 或者,你也可以听听有多年专业软件开发经验的人的意见!!
  • 谢谢@AshleyMills。 :-)
  • 谢谢!这很简单,我明白!我只有两个问题:1)在这种情况下,是否不需要为 if 语句设置条件?为什么做不到?例如if isPlaying = true 2) 在这种情况下,“发送者”是什么意思?我在想插入按钮名称会更有意义..请解释一下!太感谢了! @AshleyMills 你也能帮忙吗?
【解决方案2】:

在您的故事板中,将 Default 状态标题设置为“Start”,将 Selected 状态标题设置为“Pause”

或者,如果您在代码中执行此操作:

startPauseButton.setTitle("Start", forState: .Normal)
startPauseButton.setTitle("Pause", forState: .Selected)

在您的IBAction func 中,在truefalse 之间切换button.selected 属性

@IBAction func toggleStopwatch(button:UIButton) {
    if button.selected {
        // Pause the stopwatch
    } else {
        // Start the stopwatch
    }
    button.selected = !button.selected
}

您还可以为不同的状态设置不同的图像:DefaultHighlightedSelectedDisabled

【讨论】:

  • 感谢您的回复!在IBAction方法中,我写button.selected的时候报错:'(AnyObject) -> ()' does not have a member named selected 什么意思?另外,我注意到写“按钮”后,Xcode 会提示我插入(发件人:AnyObject),这是什么意思?感谢您的宝贵时间,我是编程新手!
  • 默认情况下,Xcode 创建一个IBAction 方法,参数类型为AnyObject。如您所知,您正在连接到一个按钮,您可以将类型更改为 UIButton - 通过更改代码,或通过在您出现的弹出窗口中将 Type 更新为 UIButton在 Interface Builder 中连接
【解决方案3】:

在按钮的@IBAction 中(假设您正在使用情节提要),您可以将按钮的标题或图像更改为您想要的。您还可以检查标题或图像,并根据您拥有的内容执行操作。

@IBAction func pressbutton(sender: UIButton) {
    switch sender.titleLabel?.text {
        case "Play":
        play()
        case "Pause":
        pause()
    default:
        other()
    }
    sender.titleLabel?.text = "Whatever you want"
}

或者使用图像(假设您在某处有一个存储图像的 images 数组,您应该这样做):

@IBAction func pressbutton(sender: UIButton) {
    switch sender.imageView!.image! {
        case images[0]:
            play()
        case images[1]:
            pause()
    default:
        other()
    }
    sender.imageView?.image = UIImage(...)
}

【讨论】:

  • 将按钮标题用作状态测试是非常糟糕的做法:例如,如果将应用翻译成另一种语言会怎样?
  • @AshleyMills 然后您可以使用 NSLocalisedString("Play") 进行检查,但 selected 方式更好恕我直言
【解决方案4】:

试试这个....

@IBAction func btnStopWatch(sender: UIButton) {
        if btnStopWatch.selected == true  {
            btnStopWatch.setTitle("stop", forState: UIControlState.Normal)
            btnStopWatch.setImage(stopImage, forState: UIControlState.Normal)
            btnStopWatch.selected = false
        } else {
            btnStopWatch.setTitle("start", forState: UIControlState.Normal)
            btnStopWatch.setImage(startImage, forState: UIControlState.Normal)
            btnStopWatch.selected = true
        }
    }

【讨论】:

  • 您好,感谢您的回复!我尝试在 btnStopWatch 后面添加 .isSelected,但出现错误:'(AnyObject) -> ()' 没有名为“isSelected”的成员。这是什么意思?我还注意到 Xcode 总是提示我在 btnStopWatch 后面插入(发件人:AnyObject)。那是什么意思?我对编程真的很陌生,但我希望我能从中学到一些东西!谢谢!
  • 创建这个:@IBOutlet weak var btnStopWatch: UIButton!
  • if btnStopWatch.isSelected 级别现在出现另一个错误:找不到成员“isSelected”
【解决方案5】:

#1。切换UIButton 标题

在 Swift 3 中,UIButton 有一个名为 setTitle(_:for:) 的方法。 setTitle(_:for:) 有以下声明:

func setTitle(_ title: String?, for state: UIControlState)

设置标题以用于指定状态。

以下 Playground 代码展示了如何使用 setTitle(_:for:) 来根据按钮的状态切换按钮的标题:

import PlaygroundSupport
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = UIColor.white

        let button = UIButton(type: UIButtonType.system)
        button.addTarget(self, action: #selector(toggle(sender:)), for: UIControlEvents.touchUpInside)

        // Set button's states
        button.setTitle("Start", for: UIControlState.normal)
        button.setTitle("Pause", for: UIControlState.selected)

        // set layout
        view.addSubview(button)
        button.translatesAutoresizingMaskIntoConstraints = false
        let horizontalConstraint = button.centerXAnchor.constraint(equalTo: view.centerXAnchor)
        let verticalConstraint = button.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint])
    }

    /// trigger action when button is tapped
    func toggle(sender: UIButton) {
        sender.isSelected = !sender.isSelected
        print("Button state: \(sender.isSelected)")
    }

}

let vc = ViewController()
PlaygroundPage.current.liveView = vc

使用 View 在 Playground 助手编辑器中预览您的视图控制器 > Assistant Editor > Show Assistant Editor


#2。切换UIButton 图片

UIButton 有一个名为setImage(_:for:) 的方法。 setImage(_:for:) 有以下声明:

func setImage(_ image: UIImage?, for state: UIControlState)

设置用于指定状态的图像。

以下 Playground 代码展示了如何使用 setImage(_:for:) 来根据按钮的状态切换按钮的标题:

import PlaygroundSupport
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = UIColor.white

        let button = UIButton()
        button.addTarget(self, action: #selector(toggle(sender:)), for: UIControlEvents.touchUpInside)

        // Set button's states
        button.setImage(UIImage(named: "on.png"), for: UIControlState.normal)
        button.setImage(UIImage(named: "off.png"), for: UIControlState.selected)

        // set layout
        view.addSubview(button)
        button.translatesAutoresizingMaskIntoConstraints = false
        let horizontalConstraint = button.centerXAnchor.constraint(equalTo: view.centerXAnchor)
        let verticalConstraint = button.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        let heightConstraint = button.heightAnchor.constraint(equalToConstant: 100)
        let widthConstraint = button.widthAnchor.constraint(equalToConstant: 100)
        NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint, heightConstraint, widthConstraint])
    }

    /// trigger action when button is tapped
    func toggle(sender: UIButton) {
        sender.isSelected = !sender.isSelected
        print("Button state: \(sender.isSelected)")
    }

}

let vc = ViewController()
PlaygroundPage.current.liveView = vc

使用 View 在 Playground 助手编辑器中预览您的视图控制器 > Assistant Editor > Show Assistant Editor

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 2015-09-15
    • 1970-01-01
    相关资源
    最近更新 更多