无法在用户点击swift iOS上更改多个按钮颜色?

时间:2018-05-07 06:12:36

标签: ios swift uibutton

在我的项目中,我在一个屏幕上使用了6个按钮。我想根据用户的点击和"日订单值"更改按钮颜色。我正在获得"日订单价值"从server.for示例用户日订单值等于1,如果用户点击day2按钮day1按钮应为蓝色并且剩余所有按钮背景颜色应为白色,则day1按钮背景颜色应为红色。

请参阅以下屏幕截图。

enter image description here

如果用户按下一个按钮,应该突出显示特定按钮,其中一些颜色剩余按钮应该是相同的颜色。我可以通过检查每个条件来更改按钮颜色,但我想以简单的方式编写。

请参阅以下我试过的代码" 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
        }


    }

5 个答案:

答案 0 :(得分:6)

根据您的查询,这很简单。请按照以下步骤进行操作 -

第1步:在viewController中添加UIButton对象。就像那样 -

 var selectedButton: UIButton? = nil

第2步:为所有按钮添加相同的按钮操作 -

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

   }
}

第3步:现在,更新按钮选择

func updateButtonSelection(_ sender: UIButton){

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

}

第4步:检查用户所选日期(为此您需要分别在1到6的按钮上添加标记)

 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
 }

答案 1 :(得分:0)

我使用我的逻辑附加了一个演示:

为此,您需要获取UIButton的Group Outlets并为每个分配一个唯一标记,然后在下面的演示中描述其余逻辑。

喜欢

 @IBOutlet var btnAllSelected: [UIButton]!

然后是这样简单的逻辑:

 @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

仅供参考: - 请忽略其中安装的广告连播。我编辑了另一个演示并为你制作了一个。

希望这有帮助。

答案 2 :(得分:0)

您应该为所有UIButtons创建@IBOutlet var arrButtons: [UIButton]! ,就像这样,

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

只为所有按钮实现一个按钮点击事件,请找到belo代码。

moment.format()

答案 3 :(得分:0)

简化代码,它使用按钮数组和索引:

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
}

如果将UserDefaults中的值保存为Int

,可能会更简单

答案 4 :(得分:0)

这是众多解决方案之一。

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