Как я могу заполнить представление выбора в зависимости от выбора другого представления выбора в Swift?
Поиск решения для заполнения вида выбора в зависимости от выбора другого вида выбора в том же контроллере вида. Первый выбирает категорию. Вторая-предметы этой категории.
Вот что я (быстрый новичок) придумал:
import UIKit
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
var countryClasses = ["US", "EU", "JP"]
var usItems = ["usitem1", "usitem2", "usitem3", "usitem4", "usitem5"]
var euItems = ["euitem1", "euitem2", "euitem3", "euitem4", "euitem5"]
var jpItems = ["jpitem1", "jpitem2", "jpitem3", "jpitem4", "jpitem5"]
@IBOutlet weak var countryPicker: UIPickerView!
@IBOutlet weak var itemPicker: UIPickerView!
override func viewDidLoad() {
super.viewDidLoad()
self.countryPicker.dataSource = self;
self.countryPicker.delegate = self;
self.itemPicker.dataSource = self;
self.itemPicker.delegate = self;
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return countryClasses.count
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
return countryClasses[row]
}
}
3 ответа:
Поскольку оба средства выбора используют один и тот же делегат, вам понадобится способ идентифицировать их при запуске методов делегирования, а также текущая структура массива означает, что вам понадобится способ выбрать каждый массив элементов, как и когда выбрана страна.
Создайте хранилище для выбранного массива элементов.
var selectedItemsArray = []
Добавьте некоторые проверки в методы делегирования.
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { return 1 } func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { if pickerView == countryPicker { return countryClasses.count } else if pickerView == itemPicker { return selectedItemsArray.count } return 0 } func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! { if pickerView == countryPicker { return countryClasses[row] } else if pickerView == itemPicker { return selectedItemsArray[row] } return 0 }
Затем вам нужно реализовать did Select row для настройки магазина товаров и перезагрузки данные.
Я не тестировал этот код, но логика должна быть правильной.func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { if pickerView == countryPicker { switch row { case 0: selectedItemsArray = usItems case 1: selectedItemsArray = euItems case 2: selectedItemsArray = jpItems default: selectedItemsArray = [] } // IMPORTANT reload the data on the item picker itemPicker.reloadAllComponents() } else if pickerView == itemPicker { // Get the current item var item = selectedItemsArray[row] // Assign value to a label based on which array we are using if selectedItemsArray == usItems { usLabel.text = item } else if selectedItemsArray == euItems { euLabel.text = item } else if selectedItemsArray == jpItems { jpLabel.text = item } } }
Свяжите каждый вид выбора с тегом (чтобы их можно было идентифицировать), затем в делегате выбора идентифицируйте эти средства выбора на основе этих идентификаторов и покажите другой
Спасибо @Wez!
В Swift 2.2 небольшая, но важная поправка возвращает функцию в виде строки, что делает ее отлично работающей.
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! { if pickerView == countryPicker { return countryClasses[row] } else if pickerView == itemPicker { return selectedItemsArray[row] } return selectedItemsArray[row] as? String }