본문 바로가기

IOS Swift/Swift 공부 기록

Swift) UIStackView에 UIButton 넣기!

 

 

 

다중 UISegmentControl를 구현해볼려고 했는데 Segment로 안돼서 UIStackView에 UIButton을 넣어서 isSelected를 연구해서 만들어보았다!  또한 UIButton의 Title을 배열에 담고 중복처리 및 isSelected = false까지 해볼려고한당.

 

UIStackView연결

 

선택한 UIButton의 title을 담을 빈 배열

 

 

Main.Stroyboard에 UIStackView하나를 깔아주고 ViewController파일과 @IBOutlet 연결!

 

 

사용한 어트리티뷰 설정

 

그리고 UIButton을 넣을 custom 코드!

func setUpDeviceSelectStackview() {
        let devices = ["iPhone","iMac","iPad","Macbook"]
        for i in 0...3 {
            let button = UIButton(type: .system)
            button.setTitle(devices[i], for: .normal)
            button.setTitleColor(.black, for: .normal)
            button.titleLabel?.font = .boldSystemFont(ofSize: 10)
            button.layer.cornerRadius = 10
            button.addTarget(self, action: #selector(setUpStackButton(_:)), for: .touchUpInside)
            deviceStackView.addArrangedSubview(button)
        }
    }

또한 버튼의 액션함수 setUpStackButton을 만들어서 addTarget으로 넣어주었다!

 

 @objc func setUpStackButton (_ sender: UIButton){
        if  sender.isSelected == false  {
            devices.append(sender.titleLabel?.text ?? "")
            sender.isSelected = true
        } else {
            for i in 0..<devices.count {
                if devices[i] == sender.titleLabel?.text ?? "" {
                    devices.remove(at: i)
                    sender.isSelected = false
                    return
                }
            }
        }
    }

devices 배열에 중복으로 들어가지 않게 isSelected가 true상태일때(버튼이 터치된 상태) for 문을 돌려

title과 맞으면 isSelected = false로 바꾸고 바로 return한다 

return을 안넣어주면 for 문이 계속 돌아가서 out of range error이 뜬다!!

이거 때문에 1시간 날림;; 별것도 아니었는데 ㅜㅜㅠㅠㅠ

 

또 다른 버튼을 만들어서 이 isSelected상태가 된걸 일괄 취소하는 @IBAction Button을 만들었다!!

다른 UIButton을 만들어 @IBAction을 만들어 준 후 아래 코드를 넣으면!

for i in 0...3 {
            if let device = deviceStackView.arrangedSubviews[i] as? UIButton {
                if device.isSelected == true {
                    device.isSelected = false
                }
            }
        }

선택된 UIStackView의 하위 뷰들인 UIButton들이 일괄로 취소된다!

정확히는 isSelected = true(선택되있는 UIButton)들만 골라서 다 취소시킨다!

 

오늘도 단순한 기능을 오랜 삽질로 하나 만들어보았다!