Segmented control does not work as expected on segment 0

I have a segmented control that changes 5 images on one of my View controllers (see image below), but I want segment 0 to be selected immediately when someone goes to the Casting tab. Currently it only gets selected when I go to segment 1 or 2 and then back again, after which it obviously works as it should.

In the attribute inspector next to the behavior, I enabled and selected the checkbox, I even tried State Selected, but it was always the same result, so I'm not sure where I am going wrong. I can get a visual fix by adding code to my ViewDidLoad for 5 images, setting four of them to .isHidden = true and one to .isHidden = false, but that clearly doesn't solve my problem.

Here is my code:

    import UIKit

        class CastingViewController: UIViewController {

            let runesArray = [Rune(runeName: "Fehu", runeImage: UIImage(named: ("Fehu.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Uruz", runeImage: UIImage(named: ("Uruz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Thurisaz", runeImage: UIImage(named: ("Thurisaz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Ansuz", runeImage: UIImage(named: ("Ansuz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Raidho", runeImage: UIImage(named: ("Raidho.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Kenaz", runeImage: UIImage(named: ("Kenaz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Gebo", runeImage: UIImage(named: ("Gebo.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Wunjo", runeImage: UIImage(named: ("Wunjo.png"))!, runeDescription: "Description goes here."),

                              Rune(runeName: "Hagalaz", runeImage: UIImage(named: ("Hagalaz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Nauthiz", runeImage: UIImage(named: ("Nauthiz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Isa", runeImage: UIImage(named: ("Isa.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Jera", runeImage: UIImage(named: ("Jera.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Eihwaz", runeImage: UIImage(named: ("Eihwaz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Perthro", runeImage: UIImage(named: ("Perthro.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Algiz", runeImage: UIImage(named: ("Algiz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Sowilo", runeImage: UIImage(named: ("Sowilo.png"))!, runeDescription: "Description goes here."),

                              Rune(runeName: "Tiwaz", runeImage: UIImage(named: ("Tiwaz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Berkano", runeImage: UIImage(named: ("Berkano.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Ehwaz", runeImage: UIImage(named: ("Ehwaz.png"))!, runeDescription: "(Description goes here."),
                              Rune(runeName: "Mannaz", runeImage: UIImage(named: ("Mannaz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Laguz", runeImage: UIImage(named: ("Laguz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Ingwaz", runeImage: UIImage(named: ("Ingwaz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Dagaz", runeImage: UIImage(named: ("Dagaz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Othala", runeImage: UIImage(named: ("Othala.png"))!, runeDescription: "Description goes here.")]

            var runesCastArray: [UIImage] = [] // Array to save Rune images for 3 or 5 Rune Cast

    @IBOutlet weak var segmentedControl: UISegmentedControl!
    @IBOutlet weak var runeOne: UIImageView!
    @IBOutlet weak var runeTwo: UIImageView!
    @IBOutlet weak var runeThree: UIImageView!
    @IBOutlet weak var runeFour: UIImageView!
    @IBOutlet weak var runeFive: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

    }

    override func viewWillAppear(_ animated: Bool) {
        segmentedControl.selectedSegmentIndex = 0
    }

    var runeCast = 0 // Need to check if this will work in a Switch statement

    var storedRuneOne: UIImage!
    var storedRuneTwo: UIImage!
    var storedRuneThree: UIImage!
    var storedRuneFour: UIImage!
    var storedRuneFive: UIImage!

    func oneRuneCast() {

        runeCast = 1
        runeOne.isHidden = true
        runeTwo.isHidden = true
        runeThree.isHidden = true
        runeFour.isHidden = true
        runeFive.isHidden = false

    }

    func threeRuneCast() {

        runeCast = 3
        runeOne.isHidden = true
        runeTwo.isHidden = false
        runeThree.isHidden = true
        runeFour.isHidden = false
        runeFive.isHidden = false

    }

    func fiveRuneCast() {

        runeCast = 5
        runeOne.isHidden = false
        runeTwo.isHidden = false
        runeThree.isHidden = false
        runeFour.isHidden = false
        runeFive.isHidden = false

    }

    @IBAction func castType(_ sender: Any) {

       switch segmentedControl.selectedSegmentIndex {
        case 0:
            oneRuneCast()
        case 1:
            threeRuneCast()
        case 2:
            fiveRuneCast()
        default: break
        }

    }

    @IBAction func castButtonPressed(_ sender: Any) {

        if runeCast == 1 {

        let randomRunes = runesArray[Int(arc4random_uniform(UInt32(runesArray.count)))]

            runeFive.image = randomRunes.runeImage


        } else if runeCast == 3 {

            let randomRunes = runesArray[Int(arc4random_uniform(UInt32(runesArray.count)))]

            runeTwo.image = randomRunes.runeImage
            runeFour.image = randomRunes.runeImage
            runeFive.image = randomRunes.runeImage

        } else if runeCast == 5 {

            let randomRunes = runesArray[Int(arc4random_uniform(UInt32(runesArray.count)))]

            runeOne.image = randomRunes.runeImage
            runeTwo.image = randomRunes.runeImage
            runeThree.image = randomRunes.runeImage
            runeFour.image = randomRunes.runeImage
            runeFive.image = randomRunes.runeImage

            }
    }
}

      

enter image description here

+3


source to share


2 answers


Programmatically set segment index to viewDidAppear or viewDidLoad (up to your application requirements)



override func viewDidAppear() {
        super.viewDidAppear()

        segmentedControl.selectedSegmentIndex = 0
}

      

+2


source


You need to reset the index of the selected segment when the view appears (eg in viewWillAppear

), but programmatically changing the selected segment does not invoke an action handler; you need to call this explicitly.

You can also simplify your code by putting UIImageViews

in an array;



class CastingViewController: UIViewController {

            let runesArray = [Rune(runeName: "Fehu", runeImage: UIImage(named: ("Fehu.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Uruz", runeImage: UIImage(named: ("Uruz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Thurisaz", runeImage: UIImage(named: ("Thurisaz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Ansuz", runeImage: UIImage(named: ("Ansuz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Raidho", runeImage: UIImage(named: ("Raidho.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Kenaz", runeImage: UIImage(named: ("Kenaz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Gebo", runeImage: UIImage(named: ("Gebo.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Wunjo", runeImage: UIImage(named: ("Wunjo.png"))!, runeDescription: "Description goes here."),

                              Rune(runeName: "Hagalaz", runeImage: UIImage(named: ("Hagalaz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Nauthiz", runeImage: UIImage(named: ("Nauthiz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Isa", runeImage: UIImage(named: ("Isa.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Jera", runeImage: UIImage(named: ("Jera.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Eihwaz", runeImage: UIImage(named: ("Eihwaz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Perthro", runeImage: UIImage(named: ("Perthro.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Algiz", runeImage: UIImage(named: ("Algiz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Sowilo", runeImage: UIImage(named: ("Sowilo.png"))!, runeDescription: "Description goes here."),

                              Rune(runeName: "Tiwaz", runeImage: UIImage(named: ("Tiwaz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Berkano", runeImage: UIImage(named: ("Berkano.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Ehwaz", runeImage: UIImage(named: ("Ehwaz.png"))!, runeDescription: "(Description goes here."),
                              Rune(runeName: "Mannaz", runeImage: UIImage(named: ("Mannaz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Laguz", runeImage: UIImage(named: ("Laguz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Ingwaz", runeImage: UIImage(named: ("Ingwaz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Dagaz", runeImage: UIImage(named: ("Dagaz.png"))!, runeDescription: "Description goes here."),
                              Rune(runeName: "Othala", runeImage: UIImage(named: ("Othala.png"))!, runeDescription: "Description goes here.")]

            var runesCastArray: [UIImage] = [] // Array to save Rune images for 3 or 5 Rune Cast

    @IBOutlet weak var segmentedControl: UISegmentedControl!
    @IBOutlet weak var runeOne: UIImageView!
    @IBOutlet weak var runeTwo: UIImageView!
    @IBOutlet weak var runeThree: UIImageView!
    @IBOutlet weak var runeFour: UIImageView!
    @IBOutlet weak var runeFive: UIImageView!

    var runeImageViews:[UIImageView]!
    var runeCount = 1

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        self.runeImageViews=[runeFive,runeFour,runeThree,runeTwo,runeOne]

    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        segmentedControl.selectedSegmentIndex = 0
        self.runeCount = 1
        self.showHideRuneViews()
    }

    func showHideRuneViews(clearImage: Bool=true) {
        for i in 0..<self.runeImageViews.count {
            let imageView = self.runeImageViews[i]
            if i < self.runeCount {
                imageView.isHidden = false
            } else {
                imageView.isHidden = true
            }
            if clearImage {
                imageView.image = nil
            }
        }
    }

    func runeCast() {
        for i in 0..<self.runeImageViews.count.reversed() {
            let imageView = self.runeImageViews[i]
            if i < self.runeCount {
                 imageView.image = runesArray[Int(arc4random_uniform(UInt32(runesArray.count)))]
            } else {
                  imageView.image = nil
        }
    }

    @IBAction func castType(_ sender: Any) {

       switch segmentedControl.selectedSegmentIndex {
        case 0:
            self.runeCount = 1
        case 1:
            self.runeCount = 3
        case 2:
            self.runeCount = 5
        default: break
        }

        self.showHideRuneViews()

    }

    @IBAction func castButtonPressed(_ sender: Any) {
        self.runeCast()
    }
}

      

0


source







All Articles