Как изменить заголовок в одном из компонентов Пикера в зависимости от значения другого компонента (например, в Календаре, Событии -> Повторить -> Пользовательский экран) - PullRequest
0 голосов
/ 05 сентября 2018

В моем приложении я пытаюсь воссоздать ту же логику поведения для двух PickerView, что и в собственном приложении Календарь iOS, в Event -> Repeat -> Custom screen.

Как я понял, я могу изменить весь 2-мерный сборщик, в зависимости от значения 1-го сборщика. Просто сделайте несколько сборщиков в ячейке 2-го выбора, с другим текстом в 2-ом компоненте, и сделайте их isHidden = true или false, в зависимости от selectedRow 1-го выбора. Поэтому, если пользователь выбрал «Ежедневно» в 1-м Средстве выбора, я сделаю видимым 2-ой Средство выбора с количеством дней в первом компоненте и текстом «дни» во втором, и другие 2-ые Средства выбора (с «неделями» и «мотыльками» во втором компоненте) - скрытый. Не очень лаконично для меня, но может быть использовано, потому что, когда пользователь взаимодействует с первым средством выбора, второе не отображается.

Но я не могу понять, как сделать так, чтобы текст 2d-компонента в 2d Picker зависел от значения 1-го компонента в том же самом Picker. Как мы видим в Календаре, когда пользователь выбирает «1» в первом компоненте, во втором он видит «день», но когда он выбирает число больше 1, он видит «дни» во втором компоненте. Не удается найти, как изменить заголовки сборщиков после загрузки представлений.

Как я могу заставить это работать? Очень жду ваших ценных советов.

Снимок экрана этого события -> Повтор -> Пользовательский экран в приложении Календарь

UPD:

Проблема была решена с помощью .reloadComponent(Int).

И вот код, который у меня есть, надеюсь, он кому-нибудь поможет. :) Он также содержит логику для обновления заголовков в правой части обеих ячеек Пикера и обновления текста в нижнем колонтитуле, так же, как в Календаре.

class CustomRepeatTableViewController: UITableViewController, UIPickerViewDataSource, UIPickerViewDelegate {

@IBOutlet weak var frequencyPicker: UIPickerView!
@IBOutlet weak var frequencyLabel: UILabel!

@IBOutlet weak var frequensyNumberPicker: UIPickerView!
@IBOutlet weak var frequencyNumberLabel: UILabel!

    let frequencyPickerData = [
        ["Minutely", "Hourly","Daily","Weekly"]
    ]

    var frequencyNumberPickerData = [
        ["1", "2", "3", "4", "5"]
    ]

    let units = ["minute", "hour", "day", "week"]

    func updatePicker(_ pickerView: UIPickerView, _ component: Int, _ row: Int) {
        let unit = units[frequencyPicker.selectedRow(inComponent: 0)]
        if pickerView == frequencyPicker {
            frequencyNumberPickerData.remove(at: 1)
            if frequensyNumberPicker.selectedRow(inComponent: 0) == 0 {
                frequencyNumberPickerData.append([unit])
            } else {
                frequencyNumberPickerData.append([unit + "s"])
            }
            frequensyNumberPicker.reloadComponent(1)
        } else {
            if component == 0 && row == 0 {
                frequencyNumberPickerData.remove(at: 1)
                frequencyNumberPickerData.append([unit])
                frequensyNumberPicker.reloadComponent(1)
            } else {
                frequencyNumberPickerData.remove(at: 1)
                frequencyNumberPickerData.append([unit + "s"])
                frequensyNumberPicker.reloadComponent(1)
            }
        }
    }

    func updateLabels() {
        let selectedRow = frequencyPicker.selectedRow(inComponent: 0)
        let unit = units[selectedRow]
        let frequencyNumber = frequencyNumberPickerData[0][frequensyNumberPicker.selectedRow(inComponent: 0)]
        var text: String
        var footerText: String

        let frequency = frequencyPickerData[0][selectedRow]
        frequencyLabel.text = frequency

        if frequensyNumberPicker.selectedRow(inComponent: 0) > 0 {
            text = frequencyNumber + " " + unit + "s"
            footerText = frequencyNumber + " " + unit + "s."
        } else {
            text = unit.capitalized
            footerText = unit + "."
        }

        frequencyNumberLabel.text = text

        tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 230, height: 30))
        let label = UILabel(frame: CGRect(x:20, y:0, width:230, height:30))
        label.text = "Repeat will occur every " + footerText
        label.font = label.font.withSize(13)
        label.textColor = UIColor.darkGray
        tableView.tableFooterView?.addSubview(label)
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        if pickerView == frequencyPicker {
            return frequencyPickerData.count
        } else {
            return frequencyNumberPickerData.count
        }
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if pickerView == frequencyPicker {
            return frequencyPickerData[component].count
        } else {
            return frequencyNumberPickerData[component].count
        }
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView == frequencyPicker {
            return frequencyPickerData[component][row]
        } else {
            return String(frequencyNumberPickerData[component][row])
        }
    }

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

    override func viewDidLoad() {
        super.viewDidLoad()

        frequencyPicker.delegate = self
        frequencyPicker.dataSource = self
        frequencyPicker.selectRow(1, inComponent: 0, animated: true) //to make selection separators appear

        frequensyNumberPicker.delegate = self
        frequensyNumberPicker.dataSource = self
        frequensyNumberPicker.selectRow(0, inComponent: 0, animated: true) //to make selection separators appear

        updateLabels()

        frequencyNumberPickerData.append([units[frequencyPicker.selectedRow(inComponent: 0)]])
    }
}
...