iOS

연관된 PickerView 두 개를 사용하고 싶다면? - iOS

나른한코딩 2023. 2. 28. 02:39

두 개의 연관된 PickerView

 

 

// viewDidLoad에서 delegate, dataSource 준수
override func viewDidLoad() {
    super.viewDidLoad()
    
    regionPickerView.delegate = self
    regionPickerView.dataSource = self
}

 

 

// 하나의 PickerView 안에 보여줄 Picker 갯수 지정
func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 2
}

 

 

// 각 picker 마다 몇 개의 데이터를 보여줄 것인지 지정
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    switch component {
    case 0:
        return list.count
    case 1:
        return list[firstPickerRow].guList.count
    default:
        return 0
    }
}

 

// 각 picker의 row에 보여줄 title 지정
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if pickerView == regionPickerView {
        switch component {
        case 0:
            return list[row].city.rawValue
        case 1:
	       return list[firstPickerRow].guList[row]
        default:
           return nil
       }
    } else {
       return "-"
    }
}

 

// picker를 스크롤하여 특정 row를 선택했을 때 진행하고 싶은 행위 지정
// - 여기에서는 row를 이동했을 때 resultLabel에 두 picker의 선택되어있는 title을 보여주도록 하였다.
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    switch component {
    case 0:
        firstPickerRow = row
        let selectedItem = list[firstPickerRow]
        let city = selectedItem.city.rawValue
        address = (city, nil)
        regionPickerView.reloadAllComponents()
    case 1:
        let selectedItem = list[firstPickerRow]
       address.gu = selectedItem.guList[row]
   default:
       return
   }

   resultLabel.text = "\(address.city ?? "-") \(address.gu ?? "-")"
}

 

- 코드 전문: https://github.com/keenkim1202/DoublePickerEx

반응형