【问题标题】:Swift - Cascading PickersSwift - 级联选择器
【发布时间】:2017-08-20 20:50:57
【问题描述】:

假设我有 3 个具有以下内容的选择器:

 Restaurant{
   [Menu]
    name
 }

 Menu{
  [Ingredients]
  time
 }

 Ingredients{
  ...
 }

如果对象发生变化,我如何实现自动更新的选择器? (例如,当餐厅被挑选时,它的菜单和成分会发生变化,当菜单被挑选时,成分会发生变化)

【问题讨论】:

    标签: arrays swift model filtering


    【解决方案1】:

    你可以这样做:

    class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate
    {
        @IBOutlet weak var restaurantsPicker: UIPickerView!
        @IBOutlet weak var menuPicker: UIPickerView!
        @IBOutlet weak var ingredientsPicker: UIPickerView!
    
        var restaurants = ["R1", "R2", "R3"]
    
        var menus = ["R1": ["M1", "M2"],
                    "R2": ["M2"],
                    "R3": ["M1", "M3"]]
    
        var ingredients = ["M1":["I1", "I2", "I3"],
                           "M2":["I1", "I3"],
                           "M3":["I2", "I3"]]
    
    
        func numberOfComponents(in pickerView: UIPickerView) -> Int
        {
            return 1
        }
    
        func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
        {
            if pickerView === restaurantsPicker
            {
                return restaurants.count
            }
            else if pickerView === menuPicker
            {
                let restaurant = restaurants[restaurantsPicker.selectedRow(inComponent: 0)]
                return menus[restaurant]!.count
            }
            else
            {
                let restaurant = restaurants[restaurantsPicker.selectedRow(inComponent: 0)]
                let menu = menus[restaurant]![menuPicker.selectedRow(inComponent: 0)]
                return ingredients[menu]!.count
            }
        }
    
        func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
        {
            if pickerView === restaurantsPicker
            {
                return restaurants[row]
            }
            else if pickerView === menuPicker
            {
                let restaurant = restaurants[restaurantsPicker.selectedRow(inComponent: 0)]
                return menus[restaurant]?[row]
            }
            else
            {
                let restaurant = restaurants[restaurantsPicker.selectedRow(inComponent: 0)]
                let menu = menus[restaurant]![menuPicker.selectedRow(inComponent: 0)]
                return ingredients[menu]?[row]
            }
        }
    
        func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
        {
            if pickerView === restaurantsPicker
            {
                menuPicker.reloadComponent(0)
                ingredientsPicker.reloadComponent(0)
            }
            else if pickerView === menuPicker
            {
                ingredientsPicker.reloadComponent(0)
            }
        }
    }
    

    截图:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 1970-01-01
      • 2021-06-29
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多