다중 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)들만 골라서 다 취소시킨다!
오늘도 단순한 기능을 오랜 삽질로 하나 만들어보았다!
'IOS Swift > Swift 공부 기록' 카테고리의 다른 글
Swift) UITableViewCell에 UICollectionViewCell 넣기 (0) | 2020.04.27 |
---|---|
Swift) Protocol/Get Set/ Subscript 기초 공부 (0) | 2020.04.18 |
IOS 개발자 면접 질문들 복습 (0) | 2020.04.08 |
Swift) Generic 기초 (0) | 2020.03.27 |
IOS SWIFT: Notification Push 보내기(개발자 계정 X) (0) | 2020.03.21 |