UIPickerView с пользовательской опцией UITextField - PullRequest
0 голосов
/ 29 августа 2018

не уверен, что это вопрос новичка, так как я впервые использую UIPickerView.

Мой UIPickerView в моем классе имеет этот массив:

let cameraBodies = ["A","B","C","D","E","F","G","H","I","J",
                    "K","L","M","N","O","P","Q","R","S","T",
                    "U","V","W","X","Y","Z","Other"]

Когда пользователь нажимает на мое textField, у него есть выбор из вышеуказанных строк. Если пользователь выбирает «другое», я хочу, чтобы UIPickerView отклонял и изменял на обычный TextField, чтобы пользователь мог вводить свою собственную строку. И затем, если пользователь удалит весь пользовательский текст в textField, он вернется к UIPickerView.

Я думал о наличии двух текстовых полей друг над другом, которые я буду показывать / скрывать в зависимости от того, что выберет пользователь, но я чувствую, что это не будет правильным подходом к этому.

Любая помощь в том, как этого добиться, была бы великолепна.

Вот раздел моего класса, который имеет все отношение к UIPickerView:

class newCameraController : UIViewController{

    var selectedBody: String?

    var cameraBodyCustomTextField: UITextField = {
        let textField = UITextField()
        textField.placeholder = "Custom Camera Body"
        return textField

    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        createBodyPicker()
        createToolBar()
    }

    func createBodyPicker() {

        let bodyPicker = UIPickerView()
        bodyPicker.delegate = self
        cameraBodyTextField.inputView = bodyPicker
    }

    func createToolBar() {

        let toolBar = UIToolbar()
        toolBar.sizeToFit()

        let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(newCameraController.dismissKeyboard))

        toolBar.setItems([doneButton], animated: false)
        toolBar.isUserInteractionEnabled = true
        cameraBodyTextField.inputAccessoryView = toolBar
    }

    override func dismissKeyboard() {
        view.endEditing(true)
    }

extension newCameraController: UIPickerViewDelegate, UIPickerViewDataSource {

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

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

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

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

        selectedBody = cameraBodies[row]
        cameraBodyTextField.text = selectedBody
    }

    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {

        var label: UILabel

        if let view = view as? UILabel {
            label = view
        } else {
            label = UILabel()
        }

        label.textColor = UIColor(red:0.63, green:0.63, blue:0.63, alpha:1.0)
        label.textAlignment = .center
        label.font = UIFont(name: "Avenir-Medium", size: 16.0)

        label.text = cameraBodies[row]

        return label
    }
}

1 Ответ

0 голосов
/ 29 августа 2018

По моему мнению, решение: В вашем коде вы показываете палитру вместо клавиатуры, это правильно. Теперь, когда пользователь выбирает «Другое», просто отобразите выбранное значение «Другое» в cameraBodyTextField. И покажите одно дополнительное текстовое поле чуть ниже cameraBodyTextField. Отобразить / скрыть можно с помощью автоматических ограничений высоты с более плавной анимацией.

...