IOS SWIFT-基于uibutton图像的调用代码块

Posted

技术标签:

【中文标题】IOS SWIFT-基于uibutton图像的调用代码块【英文标题】:IOS SWIFT-call code block based on uibutton image 【发布时间】:2015-03-04 03:17:21 【问题描述】:

这是我试图让它工作的代码。我的目标是根据按钮的图像调用一段代码。该按钮会根据之前的图像更改图像。

@IBOutlet weak var startFuncAButton: UIButton!

let navBtn = UIImage (named: "ArrowStraight")
let greenTimer = UIImage (named: "Timer")
let redTimer = UIImage (named: "TimerStop")

    @IBAction func startFuncA(sender: UIButton) 
    if self.startFuncAButton.imageView == greenTimer 
        println("button's image is green timer")
    
    else if self.startFuncAButton.imageView == redTimer 
        println("button's image is red timer")
    
    else if self.startFuncAButton.imageView == navBtn 
        println("button's image is arrow")
        NSLog("Start Navigation Button Pressed")
        self.navBar.hidden = true
        self.navigator = Navigator(route: self.route!)
        self.navigator?.HUD_delegate = self.navigationHUDView
        self.navigator?.locationUpdateDelegate = self
        self.navigationHUDView.hidden = false
        self.navigationHUDView.directionImageView.image = UIImage(named: "ArrowStraight")
        self.navigationHUDView.navigator = self.navigator
        self.navigationHUDView.backgroundColor = UIColor(red: 0.12, green: 0.13, blue: 0.16, alpha: 1.0)
        self.startFuncAButton.setImage(UIImage(named: "Timer"), forState: .Normal)

但是当我在应用程序中按下这个按钮时,什么也没有发生。没有打印行发送到控制台。显然,我没有正确地做条件句。如何让它根据 ios Swift 中的图像执行代码?

为了回答第一条评论,我扩展了我的代码段。正如您在最后一行中看到的,图像在两行中设置为“Timer”和“ArrowStraight”(来自 let 语句)。

【问题讨论】:

确定greenTimerredTimernavBtn 与您为按钮设置的instance 完全相同吗? 我不确定如何回答您的问题,但我添加了更多代码,希望能让事情更清楚。与现在的代码一样,没有 if 语句,箭头图像首先出现,直到它被按下,然后出现计时器图像。 【参考方案1】:

    UIButton 的“imageView”是一个 UIImageView。您试图将其等同于 UIImage。它们永远不会是同一个对象。

    依靠按钮的图像来执行条件代码是一种非常糟糕的实现方式。 UI(在您的情况下是要设置的图像)应取决于代码/逻辑(MVC 基础知识)。如果您基于图像执行条件代码,则您的逻辑取决于 UI。

    你应该有一个标志(一个枚举)来表示当前的执行状态。您应该设置按钮的图像并根据标志在按钮点击时执行代码。

    枚举 TimerStatus : 字符串

    案例绿色 = “绿色”

    案例红色 = “红色”

    案例停止=“停止”

你可以在声明枚举变量时设置默认状态:

var timerStatus : TimerStatus = .Green


switch timerStatus 
case .Green:
    // Green status code
case .Red:
    // Red status code
case .Stopped:
    // Stopped status code

【讨论】:

我绝对不想做得不好。 (1)为什么它是一个糟糕的实现(试图学习)(2)你能给我一个小例子来说明这个标志 [enum] 是如何工作的吗?或者指向我的教程或示例链接?【参考方案2】:

您正在测试 UImageView 是否等于 UIImage。改为这样做:

self.startFuncAButton.imageView.image == greenTimer

【讨论】:

以上是关于IOS SWIFT-基于uibutton图像的调用代码块的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 2.0 更新 UIButton 图像

UIButton不在两个图像之间切换Swift 4.2

如何实现UIButton的小型Dropdown,例如在Swift 4和iOS 11中选择货币?

Swift:如何在单击提交按钮时更改 UIButton 图像

使用swift在背景图像上的uibutton文本

如何在 Swift 中 UITest 更改 UIButton 的图像?