如何在点击时重复更改按钮?

6
使用Swift,我该如何制作:
  1. 一个带有“开始”字样的按钮,并且当点击后可以无限次地切换为“暂停”和“开始”?(例如在秒表应用中)
  2. 一个自定义图片按钮,当点击后可以切换两张不同的图片,并且可以无限次进行此操作?

编辑您的帖子,展示您迄今为止完成了什么。 - SaintLike
我只是随意地玩弄按钮... 没有什么有趣的东西可以展示!但是!哈哈! - Allister Bah
5个回答

4
在你的故事板中,将 默认 状态的标题设置为“开始”,将 选定 状态的标题设置为“暂停”。
或者,如果你是在代码中完成这个操作:
startPauseButton.setTitle("Start", forState: .Normal)
startPauseButton.setTitle("Pause", forState: .Selected)

在你的IBAction func中,将button.selected属性在truefalse之间切换。
@IBAction func toggleStopwatch(button:UIButton) {
    if button.selected {
        // Pause the stopwatch
    } else {
        // Start the stopwatch
    }
    button.selected = !button.selected
}

您可以为不同状态设置不同的图像:默认高亮选定禁用

谢谢您的回复! 在IBAction方法中,当我写button.selected时出现错误: “(AnyObject) -> ()”没有名为selected的成员这是什么意思? 还有,我注意到在写“button”后,Xcode会提示我插入(sender:AnyObject),这是什么意思?感谢您的时间,我是编程新手! - Allister Bah
默认情况下,Xcode使用“AnyObject”作为参数类型创建“IBAction”方法。由于您知道正在连接到按钮,因此可以将类型更改为UIButton - 无论是通过更改代码还是通过在Interface Builder中连接时更新TypeUIButton弹出窗口。 - Ashley Mills

4

步骤1:创建一个布尔变量

var isPlaying:Bool = false

步骤二:将您的按钮与此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来存储状态。 - Ashley Mills
谢谢!这很简单,我明白了!我只有两个问题:1)在这种情况下,if语句不需要设置条件吗?为什么不能这样做?例如,如果isPlaying = true 2)在这种情况下,“sender”是什么意思?我认为插入按钮名称更有意义..请解释一下!非常感谢! @AshleyMills你能帮忙吗? - Allister Bah
有很多需要回答的问题 - 你应该考虑创建一个新问题或者更新原来的问题以便让其他人帮助你。 - Ashley Mills
@AllisterBah,1)在Swift中,不需要检查== true,如果您编写if isPlaying,它将检查它是否为true,否则为false。 2)是的,您可以选择任何名称。 - Mohammad Zaid Pathan
但是,如果我用我的按钮名称替换“sender”,那么就会出现错误:“(AnyObject)->()”没有名为“setTitle”的成员。 - Allister Bah
显示剩余4条评论

1
在按钮的@IBAction中(假设您正在使用storyboard),您可以更改按钮的标题或图像为所需内容。您还可以检查标题或图像,并根据您的检查执行操作。
@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(...)
}

将按钮标题用作状态测试是非常不好的做法:例如,如果应用程序被翻译成另一种语言会发生什么? - Ashley Mills
@AshleyMills 然后你可以使用 NSLocalisedString("Play") 进行检查,但是在我看来 selected 的方式更好。 - vrwim

0

试试这个……

@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后面插入(sender:AnyObject)。这是什么意思?我真的很新手,但我希望我能从中学到一些东西!谢谢! - Allister Bah
创建如下代码:@IBOutlet weak var btnStopWatch: UIButton! - Rahul Mayani
现在在if btnStopWatch.isSelected级别上出现了另一个错误: 找不到成员“isSelected” - Allister Bah

0

#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 > Assistant Editor > Show Assistant Editor 在 Playground 辅助编辑器中预览您的视图控制器。


#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 > Assistant Editor > Show Assistant Editor 在 Playground 辅助编辑器中预览您的视图控制器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接