2016-09-01 20 views
0

私はUIPickerViewに関する迅速な質問があります。UIPickerView - 条件付き表示

私は値を持つ2つのpickerviews

つを作成している - A、B、C、F

2つの値を持つ - B、C、D、E

と私は今にロジックをしたいですこれらの2つのピッカービューで実装する必要があります。

ロジックは、最初のピッカービューでBとCを選択した場合、2番目のピッカービューではユーザーが選択できるBとCがないことです。どうすればそれを達成できますか?

私は初心者ですので、どんなヒントもありがとうございます。

import UIKit 

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { 

    @IBOutlet weak var Picker1: UIPickerView! 

    @IBOutlet weak var Picker2: UIPickerView! 
    @IBOutlet weak var label: UILabel! 

    var savedVal1 = "" as String 
    var savedVal2 = "" as String 

    var Array = ["A", "B", "C", "F"] 
    var Array2 = ["B", "C", "D", "E"] 

    var PlacementAnswer = 0 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     Picker1.delegate = self 
     Picker1.dataSource = self 
     Picker1.tag = 1 

     Picker2.delegate = self 
     Picker2.dataSource = self 
     Picker2.tag = 2 
    } 

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
     if pickerView == Picker1 
     { return Array[row] } 
     else if pickerView == Picker2 
     { return Array2[row] } 
     return "" 
    } 

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
     if pickerView == Picker1 
     { return Array.count } 
     else if pickerView == Picker2 
     { return Array2.count } 
     return 1 
    } 

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 

     return 1 
    } 
} 

答えて

0

であなたのpickerViewための選択デリゲート機能を実装します。

var array3 = Array2 //Create a copy of Array 2 

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
    //Check if picker is picker1 and the chosen value is "B" or "C" 
    if pickerView == Picker1 { 
     if Array[row] == "B" || Array[row] == "C" { 
      //Check if "B" and "C" is available 
      if let index = Array2.indexOf(Array[row]) { 
       //Remove it from Picker2 datasource array and reload it 
       Array2.removeAtIndex(index) 
       Picker2.reloadAllComponents() 
      } 
     } 
     else { 
      //If choose another option other than "B" and "C", revert back to the first array 
      Array2 = array3 
      Picker2.reloadAllComponents() 
     } 
    } 
} 

そして正直にあなたはスウィフトコード発明についてお読みください、変数がとき、小文字も方法の

+0

ありがとうございました。ちょうど質問 - このコマンド "Array2.indexOf(Array2.indexOf(Array [row]))"エラーメッセージがあります - "オプションの型 'インデックスの値ですか?アンラップされていない、あなたは '!'または '?' " –

+0

ああ、申し訳ありません私はちょうどコンパイラなしでそれを書いていますので、システムによって修正をたどって'! 'を追加することができます – Tj3n

+0

ありがとうございます。別の問題が発生しました。最初のpickerViewで値を選択すると、2番目のpickerViewの対応する値が削除されます。最初のpickerViewで同じ値を再選択すると、エラーが発生しました。 –

0

一つを大文字べきではありません実際に何が起こるかは、ピッカーからアイテムを削除しないことにユーザーが混同されることはありません。むしろあなたが本当に意味することを彼に示してください。彼は、オプションが特定の組み合わせでは利用できないことをよく理解しています。解決策はさらに簡単になります。

説明ユーザーは最初のピッカーからBまたはCを選択します。次に、2番目のピッカーのBまたはCが選択されている場合、は次の使用可能なオプションにジャンプします。 また、利用できない行の色を変更することができます。

//REMOVED METHOD - not able to change title color 
/*func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    if pickerView == Picker1 
    { return Array[row] } 
    else if pickerView == Picker2 
    { return Array2[row] } 
    return "" 
}*/ 

//ADDED METHOD - for styling of your UIPickerView title 
func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? { 

    let string = pickerView == Picker1 ? Array[row] : Array2[row] 

    if (pickerView == Picker2 && (row == 1 || row == 2)) { 
     return NSAttributedString(// gray row, when B or C in Picker2 
      string: string, 
      attributes: [NSForegroundColorAttributeName: UIColor.gray] 
     ) 
    } 

    return NSAttributedString(// common row 
     string: string, 
     attributes: nil) 
} 

//UPDATED METHOD - to reset second picker if user selects B or C from the second picker 
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 

    if (pickerView == Picker1 && (row == 1 || row == 2)) { 
     print("You selected B or C in first PickerView") 
    } else if (pickerView == Picker2 && (row == 0 || row == 1)) { 
     // if already set B or C in first Picker, and user has selected B or C in second picker, 
     // jump to the next available option 
     Picker2.selectRow(3, inComponent: 0, animated: true) 
    } 
} 
+0

私はSwift 3.0でコードを書いたので、コピー&ペーストすれば、コードを以前のSwiftバージョンに更新する必要があります。 – pedrouan

関連する問題