2017-02-18 14 views
1

私はこの回答を見つけましたHow do I setup a second component with a UIPickerViewそしてそれは役に立ちましたが、私はもっとしたいです。私は、第2のコンポーネントのデータを最初のコンポーネントに依存させたいと思っています。ここに私のコードUIPickerView複数のコンポーネントを迅速に

class timerScreen: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { 
// where all the outlets are setup 
@IBOutlet weak var pickerViewOutlet: UIPickerView! 
// where I try to set up all my variables and constants 
let cubesToWorkWith = ["3X3", "2X2", "4X4", "5X5", "6X6", "7X7", "Skewb", "Square-One"] 
let firstArray = ["cross", "OLL", "Pll", "Corners", "Edges"] 
let SecondArray = ["OLL" "Pll"] 

// where the picker view is set up. 
func numberOfComponents(in pickerView: UIPickerView) -> Int { 
    return 2 
} 

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
    return cubesToWorkWith.count 
} 
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    return cubesToWorkWith[row] 
} 
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
    cubeSelected = Int16(row) 
} 


} 

私は「2X2」が選択されている場合は、「3X3」が現在、第1成分とsecondArrayに選択されている場合firstArrayとは、第二の成分で表示させたいです。あなたはどうしますか? 事前にお手数をおかけしていただきありがとうございます。

答えて

-1

このようにしてください。私はあなたが欲しいものを正確に知っていません。しかし、それは最初のコンポーネントの行選択でコンポーネントをリロードしたいと思うようです。これが要件であれば、このコードは機能します。

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 
    return 2 
} 

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
    //row = [repeatPickerView selectedRowInComponent:0]; 
    var row = pickerView.selectedRowInComponent(0) 
    println("this is the pickerView\(row)") 

    if component == 0 { 
     return cubesToWorkWith.count 
    } 
    else { 
     return firstArray.count 
    } 
} 

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! { 

    if component == 0 { 
     return cubesToWorkWith[row] 
    } else { 
     return getArrayForRow(row)[row] 
    } 
} 

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
    if component == 0 { 
      pickerView.reloadComponent(1) 
    } 
} 

func getArrayForRow(row: Int) -> [String] { 
    switch row { // check if 2*2 0r 3*3 
    case 0: 
     return firstArray 
    case 1: 
     return secondArray 
    // and so on... 
    default: 
     return [] 
    } 
} 
+0

Imがエラーを取得 " '[String]'型の戻り式を 'String'型に変換できません。 "内のgetArrayForRow(行)の中に入れ子になっています –

+1

答えは間違っています。コンパイルすべきではありません。文字列が必要な場所にArrayが返されます。 ' - > String!'も意味をなさない。 – shallowThought

+0

私は答えを更新しました。実際にはその戻り値の型はStringであり、Stringの配列を返します。そのタイプの誤字。私はxcodeやツールでこれをコンパイルしていませんでした。あなたに道順を教えてくれるように私の推定された答えは – iProgrammer

-1

あなたは正しい配列を選択するシンプルなif/elseまたはswitch例を使用することができます。

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {   
    if component == 0 { 
     return cubesToWorkWith[row] 
    } else { 
     if cubesToWorkWith[lastSelectedCube] == "3X3" { 
      return firstArray[row] 
     } else if cubesToWorkWith[lastSelectedCube] == "2X2" { 
      return secondArray[row] 
     } else /* You did not mention what to show for other selections, that would be handled here */ { 
      return "undefined" 
     } 
    } 
} 

あなたはnumberOfRowsInComponentに同じをコピーして、配列のcountを返すことができます。


完全なコード:

class timerScreen: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { 
    // where all the outlets are setup 
    @IBOutlet weak var pickerViewOutlet: UIPickerView! 
    // where I try to set up all my variables and constants 
    let cubesToWorkWith = ["3X3", "2X2", "4X4", "5X5", "6X6", "7X7", "Skewb", "Square-One"] 
    let firstArray = ["cross", "OLL", "Pll", "Corners", "Edges"] 
    let secondArray = ["OLL", "Pll"] 
    var lastSelectedCube = 0 
    // where the picker view is set up. 
    func numberOfComponents(in pickerView: UIPickerView) -> Int { 
     return 2 
    } 

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 

     if component == 0 { 
      return cubesToWorkWith.count 
     } else { 
      if cubesToWorkWith[lastSelectedCube] == "3X3" { 
       return firstArray.count 
      } else if cubesToWorkWith[lastSelectedCube] == "2X2" { 
       return secondArray.count 
      } else /* You did not mention what to show for other selections, that would be handled here */ { 
       return 0 
      } 
     } 
    } 

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 

     if component == 0 { 
      return cubesToWorkWith[row] 
     } else { 
      if cubesToWorkWith[lastSelectedCube] == "3X3" { 
       return firstArray[row] 
      } else if cubesToWorkWith[lastSelectedCube] == "2X2" { 
       return secondArray[row] 
      } else /* You did not mention what to show for other selections, that would be handled here */ { 
       return "undefined" 
      } 
     } 
    } 

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     if component == 0 { 
      lastSelectedCube = row 
      pickerView.reloadComponent(1) 
     } 
    } 
} 

として両方の句は非常に似ている場合、あなたは今、余分な方法でそれらをリファクタリングすることができます

... 
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {   
    let contentArray = content(for: component) 

    return contentArray.count 
} 

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    let contentArray = content(for: component) 

    if row >= contentArray.count { 
     return nil 
    } 

    return contentArray[row] 
} 

func content(for component: Int) -> [String] { 
    if component == 0 { 
     return cubesToWorkWith 
    } else { 
     if cubesToWorkWith[lastSelectedCube] == "3X3" { 
      return firstArray 
     } else if cubesToWorkWith[lastSelectedCube] == "2X2" { 
      return secondArray 
     } else /* You did not mention what to show for other selections, that would be handled here */ { 
      return [] 
     } 
    } 
} 
...