Rx๋ฅผ ๋ชจ๋ฅด์ ๋ค๋ฉด ์ดํดํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค ๐ฅน
๋๋์ด ๋ง์ง๋ง ๊ด๋ฌธ.. ๋ ,์์ ๊ด์ฐฐํ์ฌ ์ผ ์๋ฅผ ์ ํ์!
์ผ๋จ ๋๋ ์ง๊ธ
์ด๊ฑธ ๋ง๋๋ ์ค์ด๋ค
๋ ,์์ ์์กด์ฑ์ด ์์ง๋ง, '์ผ'์ ๋ ,์์ ์์กด์ฑ์ ๊ฐ์ง๊ฒ ๋๋ค.
1์์ 31์ผ๊น์ง, 2์์ 28์ผ๊น์ง ๋ญ์ด๋ฐ๊ฑฐ ~..
๊ทธ๋์ '์ผ'์ ๋ ,์์ด ๋ฐ๋๋ฉด reset์ ํด์ฃผ์ด์ผ ํ๋ค.
์๋ฅผ๋ค์ด 2023๋ 1์31์ผ์ ๋ง๋ค์ด์ค ์ํ์์ '์'์ 2์๋ก ๋ฐ๊พธ๋ฉด 31์ผ์ ์๊ธฐ ๋๋ฌธ์!!
๊ทธ๋์ customPicker์์ ๋ญ๊ฐ๋ฅผ ์ ํํ์ ๋ ๊ด์ฐฐํ๋ ๋์์๊ฒ ์๋ ค์ค ์ ์๋๋ก
Rx๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ ์ฉํ๋ค.
(1/3)์์ ๋ง๋ค์๋ CustomPickerButton์ ์ถ๊ฐํ ๋ถ๋ถ!
public class CustomPickerButton: UIButton {
var changed = PublishRelay<String>()
//data ์ ํ์ ๋์ํ event
public func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if data?[row] == "" {
label.text = placeholder
}
else{
label.text = data?[row]
}
changed.accept(label.text ?? placeholder)
}
}
changed๋ PublishRelay๋ฅผ ์ฌ์ฉํ๋๋ฐ, ๊ทธ ์ด์ ๋ ๋ค์ด์ด๊ทธ๋จ ๋ณด๋ฉด ๋ ๋ฏ..?
Subject๋ ์๋ฆฌ๋ ๋๊ฐ๊ณ , ์ฐจ์ด์ ์ next๋ง ๋ฐฉ์ถํ๋ค๋๊ฑฐ!
๊ทธ๋ฆฌ๊ณ CustomDatePicker์์ ๋ง๋ค์๋ dataSetting()์ ์์ ํด์ค๋๋ค!!
//CustomDatePicker.swift
func dataSetting(){
var years = [String]()
for y in 1970...dateFormatter("yyyy") {
years.append(String(y))
}
yearPicker.setData(data: years.reversed())
var months = [String]()
for m in 1...12{
months.append(String(m))
}
monthPicker.setData(data: months)
}
dataSetting()์๋ ์์กด์ฑ์ด ์๋ ๋ ,์๋ง settingํ์ต๋๋ค.
ํ ๋ฒ settingํ๊ณ ๋ฐ๋ ์ผ์ด ์์ต๋๋ค. DatePicker๊ฐ ์ด๊ธฐํ ๋ ๋ ํด๋น ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋๊ฒ ์ฃ ?
๋ ๋๋ ๋ง์๋๋ก ์ ํด๋ ๋๋๋ฐ,
์ ๋ 1970๋ ๋๋ถํฐ ํ์ฌ ๋ ๋๊น์ง ๋ง๋ค์ด์ฃผ์๊ณ ,
์๋์ ์ผ๋ก ์ต๊ทผ์ ๋ง์ด ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํด์ฃผ์์ต๋๋ค
๊ทธ๋ผ ์ด์ '์ผ'์ settingํ๋ ํจ์๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
'์ผ'์ ๋ ,์์ ์์์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ , ์์ ๊ฐ์ ธ์ฌ getData()ํจ์๋ฅผ ๋ง๋ค์ด ์ค๋๋ค!!
CustomPickerButton์ getData()ํจ์๋ฅผ ๋ง๋ค์ด ์ฃผ๊ฒ ์ต๋๋ค.
extension CustomPickerButton {
func getData() -> String? {
if label.text == placeholder {
return nil
} else {
return label.text
}
}
}
๋ค์์ผ๋ก
y(๋ ),m(์)์ ๋ํด ๋ง์ง๋ง ๋ ์ ์๋ ค์ฃผ๋ finishDayํจ์๋ฅผ ๋ง๋ค์ด ์ค๋๋ค!!
์๋ฅผ๋ค์ด finishDay(2023,1)์ด๋ฉด 31์ผ์ returnํด์ค๋๋ค.
finishDay๋ ์๋์ ๊ธ์ ์ฐธ๊ณ ํ์ฌ ๋ง๋์๋ฉด ๋ฉ๋๋ค :)
https://990427.tistory.com/110
์ด๋ฅผ ๋ฐํ์ผ๋ก ๋ง๋ daySetting()์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
getData()๋ก ๋ ,์์ ๊ฐ์ ธ์ค๊ณ ~ finishDay()๋ก ๋ง์ง๋ง ๋ ์ ๊ตฌํ๊ณ ~
dayPicker์ ๋ฐ์ดํฐ ๋ฃ์ด์ฃผ๊ธฐ!
//CustomDatePicker.swift
func daySetting(){
let y = yearPicker.getData()
let m = monthPicker.getData()
guard let yy = y, let mm = m else {
dayPicker.setData(data: [])
return
}
let last = finishDay(yy: yy, mm: mm)
var days = [String]()
for d in 1...last{
days.append(String(d))
}
dayPicker.setData(data: days)
dayPicker.isEnabled = true //์ผ ์ ํํ ์ ์๊ฒ ํด์ฃผ๋ ๋ถ๋ถ!!
}
isEnabled
isEnabled๋ ๋ฒํผ์ ์ฌ์ฉ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ์ ํํฉ๋๋ค.
true๋ฉด ์ฌ์ฉ๊ฐ๋ฅํ๊ณ false๋ฉด ์ฌ์ฉํ ์ ์์ต๋๋ค!
๊ทธ๋์ ์ ์ผ ์ฒ์ View๊ฐ setting๋๋ ์์ ์ (init, didAppear ์๋ฌด๋๋)
๋ค์๊ณผ ๊ฐ์ด ์,์ผ์ ์ ํํด์ฃผ์ธ์!
์์ ์ ํํ์ง ์์๋ ๋ฌธ์ ๊ฐ ๋์ง๋ ์์ง๋ง ์์ฐจ์ ์ผ๋ก ์ ๋ ฅํ๊ฒ ํ๊ธฐ ์ํด ์ ํํ์ต๋๋ค.
monthPicker.isEnabled = false
dayPicker.isEnabled = false
์, ์ด์ CustomPickerButton์ ์๋ changed๋ฅผ ๊ด์ฐฐํด์ ๋ณ๊ฒฝ์ฌํญ์ ๋ฐ์ ํด์ฃผ์ด์ผ๊ฒ ์ฃ ?
๋จผ์ ๋ฐ์ธ๋ฉ ํด์ค๋๋ค.
์ด ํจ์๋ isEnabled์ ๊ฐ์ด ์ด๊ธฐํ ๋๋ ์์ ์ ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
//CustomDatePicker.swift
var disposeBag = DisposeBag()
func bind(){
yearPicker.changed.subscribe { [unowned self] in
self.yearCheck($0)
}.disposed(by: disposeBag)
monthPicker.changed.subscribe { [unowned self] in
self.monthCheck($0)
}.disposed(by: disposeBag)
}
๋จผ์ , '๋ '์ด ๋ฐ๋๋ฉด ํธ์ถ๋๋ yearCheck()ํจ์๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
//CustomDatePicker.swift
func yearCheck(_ year: String){
if year != yearPicker.placeholder {
monthPicker.isEnabled = true
resetDay()
}
}
(๋ชจ๋ pickerButton์ ์ซ์๋ฅผ ์ ํํ์ง ์์ ๊ฒฝ์ฐ placeholder๋ฅผ ๋ฐฉ์ถํฉ๋๋ค)
'๋ '์ด ์ ํ๋์์ผ๋ฉด, '์'์ ํ์ฑํ ํ๊ณ day๋ฅผ resetํด๋ผ
day๋ฅผ resetํ๋ ์ด์ ๋ ๋์ค์ '์ผ'์ ์ ํํ ํ์๋ '๋ '์ ๋ฐ๊ฟ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
resetDay()๋ day๋ฒํผ์ ๊ฐ์ DD๋ก ๋ฐ๊พธ๊ณ , daySetting()์ ํธ์ถํฉ๋๋ค.
๋ค์์ '์'์ด ๋ฐ๋๋ฉด ํธ์ถ๋๋ monthCheck()์ ๋๋ค.
func monthCheck(_ month: String){
if month != monthPicker.placeholder {
resetDay()
}
}
์์ฑํ๋ฉด ์ด๋ ๊ฒ!!!
๋ ,์์ด ๋ณํํจ์ ๋ฐ๋ผ '์ผ'์ด ์ด๊ธฐํ ๋ฉ๋๋ค
์ฝ๋ ์ ๋ฆฌ
๋๋ฌด ์ค๊ตฌ๋๋ฐฉ์ด๋ผ ์์ ๋ ๋ด์ฉ์ ๋ชจ์๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
public class CustomPickerButton: UIButton {
var changed = PublishRelay<String>()
func getData() -> String? {
if label.text == placeholder {
return nil
} else {
return label.text
}
}
func setData(data: [String]){
self.data = [""]+data
}
func resetData(){
label.text = placeholder
}
}
extension CustomPickerButton : UIPickerViewDataSource, UIPickerViewDelegate {
public func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if data?[row] == "" {
label.text = placeholder
}
else{
label.text = data?[row]
}
changed.accept(label.text ?? placeholder)
}
}
open class CustomDatePicker: UIView{
func bind(){
yearPicker.changed.subscribe { [unowned self] in
self.yearCheck($0)
}.disposed(by: disposeBag)
monthPicker.changed.subscribe { [unowned self] in
self.monthCheck($0)
}.disposed(by: disposeBag)
}
func finishDay(yy: String, mm: String) -> Int{
let formatter = DateFormatter()
let calendar = Calendar(identifier: .gregorian)
formatter.dateFormat = "yyyy-MM-dd"
let st = formatter.date(from: "\(yy)-\(mm)-01")!
let end = calendar.date(byAdding: .month, value: +1, to: st)!
let result = calendar.dateComponents([.day], from: st, to: end)
guard let day = result.day else {
return 0
}
return day
}
func dataSetting(){
var years = [String]()
for y in 1970...dateFormatter("yyyy") {
years.append(String(y))
}
yearPicker.setData(data: years.reversed())
var months = [String]()
for m in 1...12{
months.append(String(m))
}
monthPicker.setData(data: months)
}
func daySetting(){
let y = yearPicker.getData()
let m = monthPicker.getData()
guard let yy = y, let mm = m else {
dayPicker.setData(data: [])
return
}
let now_date = finishDay(yy: yy, mm: mm)
var days = [String]()
for d in 1...now_date{
days.append(String(d))
}
dayPicker.setData(data: days)
dayPicker.isEnabled = true
}
func yearCheck(_ year: String){
if year != yearPicker.placeholder {
monthPicker.isEnabled = true
resetDay()
}
}
func monthCheck(_ month: String){
if month != monthPicker.placeholder {
resetDay()
}
}
func resetDay(){
dayPicker.resetData()
daySetting()
}
}
ํด ๋๋์ด CustomDatePicker๋ฅผ ๋ง๋ค์ด ๋์ต๋๋ค!
๊ทธ๋๋ ์กฐ๊ธ ์์ฌ์ด ์ ์ด ์์ด์ ๊ฐ์ ์ ํด์ผํ ๊ฒ ๊ฐ์ต๋๋ค ใ ใ ใ ใ ใ
์ธ์ ๋ ์ข์ ์๊ฒฌ ์์ผ์๋ฉด ์๋ ค์ฃผ์ธ์ ๐ณ
'๐ฑ iOS > UIKit' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
modalPresentationStyle ์ค์ ์์ (feat.ViewLifeCycle) (0) | 2024.06.14 |
---|---|
[UIKit] TableView Multiple Cell, multi type json data parsing (0) | 2023.06.27 |
[UIKit] toast message ๋ง๋ค๊ธฐ (0) | 2023.02.16 |
[UIKit] CustomDatePicker ๋ง๋ค๊ธฐ (2/3) (0) | 2023.01.08 |
[UIKit] CustomDatePicker ๋ง๋ค๊ธฐ (1/3) (0) | 2023.01.08 |