简体   繁体   中英

My Question is about changing a UIImage when a button is pressed

So I am quite new to coding, learning Swift 3 on Udemy. I'm trying to test my skills by building a music app that contains 3 sound files, at the moment I am struggling to get the image of the current song that should be playing once my UIButton is pressed. I have created an array containing the image files but for some reason it only shows 2 out of the 3 images and will not go further nor will it let me loop the images, any and all suggestions are welcome.

I have tried a for-in loop which is not what I want at the moment. I am trying to get the function to update songImage to accept my array and link to the sender.tag property to cycle through the images

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
    }

}

Right now the code is showing just the image displayed upon view load and the next image in the array. I cannot get it to go through the entire array and keep going when the button is pressed.

You are using the "next" UIButton sender.tag as a parameter to change the image, but that tag never changes. So:

  • In your viewDidLoad() method, you show the third image
  • When you press the "next" button, you update the image to 1 (probably the sender.tag is 1)
  • Pressing the button again don't update the image

You can try something like this:

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)
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM