【问题标题】:My Question is about changing a UIImage when a button is pressed我的问题是关于按下按钮时更改 UIImage
【发布时间】:2019-12-29 02:25:02
【问题描述】:

所以我对编码很陌生,在 Udemy 上学习 Swift 3。我正在尝试通过构建一个包含 3 个声音文件的音乐应用程序来测试我的技能,目前我正在努力获取按下 UIButton 后应该播放的当前歌曲的图像。我创建了一个包含图像文件的数组,但由于某种原因,它只显示了 3 个图像中的 2 个,并且不会更进一步,也不会让我循环图像,欢迎任何和所有建议。

我尝试了一个 for-in 循环,这不是我目前想要的。我试图让函数更新 songImage 以接受我的数组并链接到 sender.tag 属性以循环浏览图像

class ViewController: UIViewController {

// Instance Variables
var playTheSong : AVAudioPlayer!

var imageArray = ["songImage1", "songImage2", "songImage3"]
var allSongNamesAndDescriptions = MusicClassBank()
var nextImage = 0

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    albumArtwork.image = UIImage(named: "songImage3")

}

@IBAction func buttonPressed(_ sender: UIButton) {

    updateSongImage(selectedImageFile: imageArray[sender.tag - 1])

    nextImage = nextImage + 1
}

@IBOutlet weak var albumArtwork: UIImageView!
@IBOutlet weak var nameOfSong: UILabel!
@IBOutlet weak var songDescription: UILabel!

// Cycle through images upon button being pressed.

func updateSongImage(selectedImageFile : String) {

    if nextImage <= 3 {
    albumArtwork.image = UIImage(named: selectedImageFile)
    }
    else {
        nextImage = 0
    }

}

现在代码只显示视图加载时显示的图像和数组中的下一个图像。我无法让它遍历整个数组并在按下按钮时继续运行。

【问题讨论】:

  • 这看起来“正确”,因为功能可以工作,但代码可以改进——anywho——我能看到的唯一问题可能是你如何为每个变量设置sender.tag按钮。这可能会返回一个您可能不会想到的数字。 print(sender.tag-1) 并查看打印出来的内容以确定您是否确实获得了正确的号码。
  • 如果您的数组只有三个图像,并且您从 0 开始 nextImage,则 if 条件应该是 if nextImage
  • 我只有一个按钮,称为 buttonPressed - 标题是下一首歌曲,我希望能够单击它来更改当前正在播放的歌曲的图像,此时我打印发件人。 tag 语句它打印 0 或 1,这取决于我是否将其设置为 sender.tag - 1。只是没有显示数组中的第三张图片。

标签: ios swift swift3 uibutton uiimage


【解决方案1】:

您正在使用“下一个”UIButton sender.tag 作为参数来更改图像,但该标签永远不会改变。所以:

  • 在您的 viewDidLoad() 方法中,您显示第三张图片
  • 当您按下“下一步”按钮时,会将图像更新为 1(可能sender.tag 为 1)
  • 再次按下按钮不更新图像

你可以试试这样的:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    //Set the first image
    updateSongImage(selectedImageFile : imageArray[0])
}

@IBAction func buttonPressed(_ sender: UIButton) {
    //If nextImage is less than imageArray.count - 1 (because arrays start with 0), add one to nextImage. Else, nextImage return to zero
    nextImage = nextImage < imageArray.count - 1 ? nextImage + 1 : 0
    updateSongImage(selectedImageFile: imageArray[nextImage])
}

func updateSongImage(selectedImageFile : String) {
    //Here we only need to update the image, because the if is outside
    albumArtwork.image = UIImage(named: selectedImageFile)
}

【讨论】:

  • 这是我迄今为止为解决这个问题所做的:我已经用自己的 sender.tag 编号制作了三个按钮 - 现在应用程序工作得非常好,但是为了达到这一点我有必须制作 3 个单独的按钮并将代码链接到每个按钮的 sender.tag 编号,我尝试了您的方法(目前对我来说可能有点高级) - 无论如何我只需 1 个按钮就可以实现这个结果?
  • 你好。是的,我以为你只有一个“下一首”按钮,那个按钮将歌曲传递到下一首,如果没有更多歌曲,它会返回到第一首。这段代码就是这样做的。
猜你喜欢
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多