Swift에서 텍스트 필드에 선택기 설정 및 목록 선택(콤보 상자)

Swift3.0 + Xcode8.1에서의 구현입니다.

개요



이런거.



텍스트 필드를 탭하면 아래에 피커가 표시됩니다.
콤보 박스적인 이미지입니다.

Xcode(8.1)의 표준 컴퍼넌트에는 이런 것은 없기 때문에(없지요?), 시코시코 구현합니다.

StoryBoard



먼저 StoryBoard에 Text Filed를 배치하고 ViewController에 Outlet에 연결합니다.

이런 상태.


ViewController



아래 소스 전체.

ViewController.swift
import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    @IBOutlet weak var textField: UITextField!

    var pickerView: UIPickerView = UIPickerView()
    let list = ["", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]

    override func viewDidLoad() {
        super.viewDidLoad()

        pickerView.delegate = self
        pickerView.dataSource = self
        pickerView.showsSelectionIndicator = true

        let toolbar = UIToolbar(frame: CGRectMake(0, 0, 0, 35))
        let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(ViewController.done))
        let cancelItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(ViewController.cancel))
        toolbar.setItems([cancelItem, doneItem], animated: true)

        self.textField.inputView = pickerView
        self.textField.inputAccessoryView = toolbar
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return list.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return list[row]
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        self.textField.text = list[row]
    }

    func cancel() {
        self.textField.text = ""
        self.textField.endEditing(true)
    }

    func done() {
        self.textField.endEditing(true)
    }

    func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect {
        return CGRect(x: x, y: y, width: width, height: height)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

조금 설명.

클래스는, UIPickerViewDelegate 와 UIPickerViewDataSource 를 상속할 필요가 있습니다.
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

상속하면 다음 세 가지 함수를 구현해야 합니다.
구현할 때까지 오류가 발생합니다.
func numberOfComponents(in pickerView: UIPickerView) -> Int
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?

또한 Swift3.0부터는 CGRectMake라는 좌표를 지정하는 함수를 사용할 수 없게 되어 있으므로 스스로 Wrap하는 함수를 만들어 둡니다.
func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect {
    return CGRect(x: x, y: y, width: width, height: height)
}

필수 선택을 원하는 경우



선택 목록에서 공백을 제외합니다.
//let list = ["", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
let list = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]

Cancel을 탭하면 클리어하도록 하고 있으므로, Cancel 자체 없애 준다.
let toolbar = UIToolbar(frame: CGRectMake(0, 0, 0, 35))
let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(ViewController.done))
//let cancelItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(ViewController.cancel))
//toolbar.setItems([cancelItem, doneItem], animated: true)
toolbar.setItems([doneItem], animated: true)

viewDidLoad()로 초기값을 설정한다.
self.textField.text = list[0]

라고 하면 필수가 된다고 생각합니다.

좋은 웹페이지 즐겨찾기