В моем приложении я пытаюсь воссоздать ту же логику поведения для двух 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)]])
}
}