bugfix> ios > 投稿

上の画像には2つのボタンがあります。 左ボタンを押すと背景が赤くなります。

ここで右ボタンを押すと 右ボタンの背景を赤で塗りつぶし、左ボタンを右ボタンのように白くして、ボタンを非アクティブにします。

override func viewDidLoad() {
        super.viewDidLoad()
        bookTitleFilterBtn.addTarget(self, action: #selector(bookTitleFilterBtnClicked(_:)), for: .touchUpInside)
        authorNameFilterBtn.addTarget(self, action: #selector(authorNameFilterBtnClicked(_:)), for: .touchUpInside)
    }

//left button
@objc func bookTitleFilterBtnClicked(_ sender: UIButton) {
        DispatchQueue.main.async {
            if self.isHighlighted == false {
                sender.backgroundColor = .red
                let title = NSAttributedString(string: "제목", attributes: [NSAttributedString.Key.foregroundColor: UIColor.white])
                sender.setAttributedTitle(title, for: .normal)
                sender.isHighlighted = true
                self.isHighlighted = true
            } else {
                sender.backgroundColor = .white
                let title = NSAttributedString(string: "제목", attributes: [NSAttributedString.Key.foregroundColor: UIColor.black])
                sender.setAttributedTitle(title, for: .normal)
                sender.isHighlighted = false
                self.isHighlighted = false
            }
        }
    }
//right button
    @objc func authorNameFilterBtnClicked(_ sender: UIButton) {
        DispatchQueue.main.async {
            if self.isHighlighted == false {
                sender.isHighlighted = true
                let title = NSAttributedString(string: "작가", attributes: [NSAttributedString.Key.foregroundColor: UIColor.white])
                sender.setAttributedTitle(title, for: .normal)
                sender.backgroundColor = .red
                self.isHighlighted = true
            } else {
                sender.isHighlighted = false
                self.isHighlighted = false
                let title = NSAttributedString(string: "작가", attributes: [NSAttributedString.Key.foregroundColor: UIColor.black])
                sender.setAttributedTitle(title, for: .normal)
                sender.backgroundColor = .white
            }
        }
    }

回答 3 件
  • backgroundColor を変更するのを忘れた  最初のメソッドの最初の条件で。これらの種類の問題を回避するには、関数内でロジックを定義し、何度も書き換えるのではなく、必要な場所でロジックを呼び出すようにします。

    override func viewDidLoad() {
        super.viewDidLoad()
        bookTitleFilterBtn.addTarget(self, action: #selector(buttonClicked(_:)), for: .touchUpInside)
        authorNameFilterBtn.addTarget(self, action: #selector(buttonClicked(_:)), for: .touchUpInside)
    }
    var buttons: [UIButton] { return [bookTitleFilterBtn, authorNameFilterBtn] }
    func updateButtonsAppearance(allButtons: [UIButton], selectedButton: UIButton) {
        for button in allButtons {
            let isSelected = button == selectedButton
            let currentTitle = button.currentTitle ?? "-"
            let title = NSAttributedString(string: currentTitle, attributes: [.foregroundColor: isSelected ? UIColor.white : UIColor.black])
            button.setAttributedTitle(title, for: .normal)
            button.backgroundColor = isSelected ? .red : .white
            button.isHighlighted = isSelected
        }
    }
    @objc func buttonClicked(_ sender: UIButton) {
        DispatchQueue.main.async {
            self.updateButtonsAppearance(allButtons: buttons, selectedButton: sender)
        }
    }
    
    

    両方のボタンが同じ関数を呼び出していることに注意してください。したがって、現在、唯一の真実の情報源があります。それがどこかで動作する場合、それはどこでも動作します。

  • 別のボタンのbackgroundColorを変更する次のコード行がありません。次のコード行を追加します。

    //left button
    @objc func bookTitleFilterBtnClicked(_ sender: UIButton) {
        DispatchQueue.main.async {
            if self.isHighlighted == false {
                ....
                ....
                authorNameFilterBtn.backgroundColor = .white
            } else {
                ....
            }
        }
    }
    //right button
    @objc func authorNameFilterBtnClicked(_ sender: UIButton) {
        DispatchQueue.main.async {
            if self.isHighlighted == false {
                ....
                bookTitleFilterBtn.backgroundColor = .white
            } else {
                ....
            }
        }
    }
    
    

    このコードはボタンの色を逆に変更します

  • StoryBoardから選択した左ボタンのデフォルトを設定する

    var selectedButton:String = "" // gloable variable 
    //left button
        @objc func bookTitleFilterBtnClicked(_ sender: UIButton) {
            if selectedButton != "제목"
            {
                selectedButton = "제목"
                sender.backgroundColor = .red
                let title = NSAttributedString(string: "제목", attributes: [NSAttributedString.Key.foregroundColor: UIColor.white])//title
                sender.setAttributedTitle(title, for: .normal)
                sender.isHighlighted = true
                self.isHighlighted = true
                authorNameFilterBtn.backgroundColor = .white
                let title1 = NSAttributedString(string: "작가", attributes: [NSAttributedString.Key.foregroundColor: UIColor.black])//title
                authorNameFilterBtn.setAttributedTitle(title1, for: .normal)
                authorNameFilterBtn.isHighlighted = false
                self.isHighlighted = false
            }
        }
        //right button
        @objc func authorNameFilterBtnClicked(_ sender: UIButton) {
            if selectedButton != "작가"
            {
                selectedButton = "작가"
                sender.isHighlighted = true
                let title = NSAttributedString(string: "작가", attributes: [NSAttributedString.Key.foregroundColor: UIColor.white])//Author
                sender.setAttributedTitle(title, for: .normal)
                sender.backgroundColor = .red
                self.isHighlighted = true
                bookTitleFilterBtn.isHighlighted = false
                self.isHighlighted = false
                let title1 = NSAttributedString(string: "제목", attributes: [NSAttributedString.Key.foregroundColor: UIColor.black])
                bookTitleFilterBtn.setAttributedTitle(title1, for: .normal)
                bookTitleFilterBtn.backgroundColor = .white
            }
    
    

あなたの答え