简体   繁体   中英

Unable to change multiple button colours on user's tap swift iOS?

In my project I am using 6 buttons in one screen.I want to change the button color based on user's tap and "day order value". i am getting "day order value" from server.for example user day order value is equal to 1, day1 button background color should be red if user taps on day2 button day2 button should be in blue and remaining all button background colour should be white.

Please see the below screenshot.

在此处输入图片说明

if user pressed on one button that particular button should be highlight with some color remaining buttons should be same color. I can able to change button color by checking each condition but I want to write in simple manner.

see the following code which i have i tried for "dayoredrvalue".

func UpdateButtoncolor()
    {
        let dayOrderStr  =  UserDefaults.standard.string(forKey: "dayOrderStr")
        print("dayOrderStr--",dayOrderStr)

        if (dayOrderStr?.isEqual("1"))!{


            self.day1Btn.backgroundColor = UIColor.red
            self.day2Btn.backgroundColor = UIColor.white
            self.day3Btn.backgroundColor = UIColor.white
            self.day4Btn.backgroundColor = UIColor.white
            self.day5Btn.backgroundColor = UIColor.white
            self.day6Btn.backgroundColor = UIColor.white


        }else if(dayOrderStr?.isEqual("2"))!
        {
            self.day1Btn.backgroundColor = UIColor.white
            self.day2Btn.backgroundColor = UIColor.red
            self.day3Btn.backgroundColor = UIColor.white
            self.day4Btn.backgroundColor = UIColor.white
            self.day5Btn.backgroundColor = UIColor.white
            self.day6Btn.backgroundColor = UIColor.white
        }else if(dayOrderStr?.isEqual("3"))!
        {
            self.day1Btn.backgroundColor = UIColor.white
            self.day2Btn.backgroundColor = UIColor.white
            self.day3Btn.backgroundColor = UIColor.red
            self.day4Btn.backgroundColor = UIColor.white
            self.day5Btn.backgroundColor = UIColor.white
            self.day6Btn.backgroundColor = UIColor.white
        }else if(dayOrderStr?.isEqual("4"))!
        {
            self.day1Btn.backgroundColor = UIColor.white
            self.day2Btn.backgroundColor = UIColor.white
            self.day3Btn.backgroundColor = UIColor.white
            self.day4Btn.backgroundColor = UIColor.red
            self.day5Btn.backgroundColor = UIColor.white
            self.day6Btn.backgroundColor = UIColor.white
        }else if(dayOrderStr?.isEqual("5"))!
        {
            self.day1Btn.backgroundColor = UIColor.white
            self.day2Btn.backgroundColor = UIColor.white
            self.day3Btn.backgroundColor = UIColor.white
            self.day4Btn.backgroundColor = UIColor.white
            self.day5Btn.backgroundColor = UIColor.red
            self.day6Btn.backgroundColor = UIColor.white
        }else
        {
            self.day1Btn.backgroundColor = UIColor.white
            self.day2Btn.backgroundColor = UIColor.white
            self.day3Btn.backgroundColor = UIColor.white
            self.day4Btn.backgroundColor = UIColor.white
            self.day5Btn.backgroundColor = UIColor.white
            self.day6Btn.backgroundColor = UIColor.red
        }


    }

As per your query, It's quite simple. Just follow the following -

Step 1: Add an UIButton object in your viewController. Like that -

 var selectedButton: UIButton? = nil

Step 2: Add same button Action for all your buttons -

@IBAction func btnActionSelection(_ sender:UIButton){

   if(selectedButton == nil){ // No previous button was selected

    updateButtonSelection(sender)

   }else{ // User have already selected a button

      if(selectedButton != sender){ // Not the same button

            selectedButton?.backgroundColor = .clear
            updateButtonSelection(sender)
         }

   }
}

Step 3: Now, Update button selection

func updateButtonSelection(_ sender: UIButton){

   UserDefaults.standard.set("\(sender.tag)", forKey: "dayOrderStr")
   selectedButton = sender
   selectedButton?.backgroundColor = .green

}

Step 4: Check User selected day (For that you need to add tag on buttons from 1 to 6 respectively)

 override func viewDidLoad() {
    super.viewDidLoad()

   // Check user's selected day
    if let selectedDay =  UserDefaults.standard.value(forKey: "dayOrderStr") as? String{

         debugPrint("selectedDay: "selectedDay) // Get user's selected day
         if let btn = self.view.viewWithTag(Int(selectedDay)!){

            updateButtonSelection(btn)

        }

    }

  //Other stuff
 }

I have attached a demo for you using my logic:

For this you need to take a Group Outlets of your UIButton and assign a unique tag to each and then rest logic is described in the demo attached below.

like

 @IBOutlet var btnAllSelected: [UIButton]!

And then simple logic like this:

 @IBAction func btnAllClicked(_ sender: UIButton) {

    for button in btnAllSelected {
        if sender.tag == button.tag{
            button.isSelected = true;
            button.backgroundColor = UIColor.green
        }else{
            button.isSelected = false;
            button.backgroundColor = UIColor.red
        }
    }

    if sender.tag == 1{
        print("Button 1 selected")
    }else if sender.tag == 2{
        print("Button 2 selected")
    }else if sender.tag == 3{
         print("Button 3 selected")
    }else if sender.tag == 4{
         print("Button 4 selected")
    }else if sender.tag == 5{
        print("Button 5 selected")
    }else if sender.tag == 6{
        print("Button 6 selected")
    }

}

Link to the Demo

FYI:- Please ignore the pods installed in it. I edited some another demo and made a one for you.

Hope this helps.

You should create New Referencing Outlet Collections for all your UIButtons like this,

@IBOutlet var arrButtons: [UIButton]!

Implement only one Button tap events for all your buttons, Please find belo code.

@IBAction func btnClicked(_ sender: UIButton) {
    arrButtons.forEach({$0.backgroundColor = UIColor.red})
    sender.backgroundColor = UIColor.darkGray
}

Simplified code, it uses an array of the buttons and an index:

let buttonArray = [day1Btn, day2Btn, day3Btn, day4Btn, day5Btn, day6Btn]
buttonArray.forEach { $0.backgroundColor = .white }
guard let dayOrderStr =  UserDefaults.standard.string(forKey: "dayOrderStr"),
    let dayOrderIndex = Int(dayOrderStr), 1...buttonArray.count ~= dayOrderIndex {
        buttonArray[dayOrderIndex-1].backgroundColor = .red
}

It can be still simpler if you save the value in UserDefaults as Int

Here is one solution among many others.

@IBOutlet var buttons: [UIButton]! // link all the buttons from the storyboard

func changeColorButton(sender: UIButton) {
  // default appearance for all buttons
  for button in buttons {
    button.backgroundColor = UIColor.green
  }

  // update color only for the button clicked
  sender.backgroundColor = .orange
}

@IBAction func buttonTapped(_ sender: UIButton) {
        updateFocusPicture(sender: sender)
}

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