2017-02-28 19 views
2

特定の条件に基づいて異なる結果を表示するピッカーを設定しようとしています。唯一の問題はdataSource(表示されるピッカーデータ)をviewDidLoadの外に置く必要があることです。条件が満たされた場合、適切なデータをロードするにはviewDidLoadが必要です。しかし、私が見たピッカーを扱うコードでは、dataSource配列がviewDidLoadの外に配置されているようです(デリゲートのメソッドがその値を使用できるように仮定しています)。私はちょうどをviewDidLoadに入れて、それが認識できるようにするか、またはviewDidLoadとそのクラスの外でSwitchまたはIf文を実行する方法があるかどうかを疑問に思っています。Xcode Swift 3 Picker:ViewDidLoadにデータソースを配置する

import UIKit 
import Parse 

class VC: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { 

    var pickerData = [String]() 

    @IBOutlet weak var namePicker: UIPickerView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     namePicker.dataSource = self 
     namePicker.delegate = self 


     //here I want the picker to show something different depending on the value of nameOfPerson. I changed the order of the array because the picker selects the first name of the array as the default. 
     switch nameOfPerson 
     { 
     case "Carly": 
      let pickerData = ["Carly","Jeff","Bob","Anita"] 
     case "Jeff": 
      let pickerData = ["Jeff","Carly","Bob","Anita"] 
     case "Bob": 
      let pickerData = ["Bob","Carly","Jeff","Anita"] 
     case "Anita": 
      let pickerData = ["Anita","Carly","Jeff","Bob"] 
     } 
    } 
    func numberOfComponents(in pickerView: UIPickerView) -> Int { 
    return 1 
    } 
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
    return pickerData.count 
    } 
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    return pickerData[row] 
    } 
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
    { 

    } 
} 
+1

質問にいくつかのコードを追加できますか?私は数回それを読んだ、と私はまだあなたが求めているものについて混乱しています。 –

答えて

2
、それはそれを認識することとなるように、私はのviewDidLoadにこのデータソースを置くことができる場合、私はちょうど疑問に思って

、またはスイッチまたは場合を実行する方法があった場合のviewDidLoad外とクラスの声明

いいえ。データソースメソッドはである必要があります。つまり、Objective-Cがクラスのトップレベルで機能する必要があります。したがって、データ自体はデータソースメソッドに表示される必要があります。viewDidLoadとデータソースメソッドの間でデータを共有するための唯一の一貫した方法は、var pickerDataのようなプロパティです。 あなたコードと間違って何

letです:

case "Carly": 
     let pickerData = ["Carly","Jeff","Bob","Anita"] 
    case "Jeff": 
     let pickerData = ["Jeff","Carly","Bob","Anita"] 
    case "Bob": 
     let pickerData = ["Bob","Carly","Jeff","Anita"] 
    case "Anita": 
     let pickerData = ["Anita","Carly","Jeff","Bob"] 
    } 

これらのケースのそれぞれから用語letを削除します!さもなければ、一時的なローカル変数pickerDataを設定するだけです。これはあなたがやりたいことではありません。

var pickerData = [String]() 

....とあなたのコードがそれをやっていません:あなたはこのように宣言プロパティを設定したいです!その後、最後に、ちょうど、安全側にデータを再ロードする

case "Carly": 
    self.pickerData = ["Carly","Jeff","Bob","Anita"] 
case "Jeff": 
    self.pickerData = ["Jeff","Carly","Bob","Anita"] 
case "Bob": 
    self.pickerData = ["Bob","Carly","Jeff","Anita"] 
case "Anita": 
    self.pickerData = ["Anita","Carly","Jeff","Bob"] 
} 

(プラスあなたはもちろんのdefault場合に、必要があります。)::何が欲しいのはこれです

self.namePicker.reloadAllComponents() 
+0

美しい。助けてくれてありがとう! – Kevin

+1

喜んで助けてください。これが質問にあなたのコードを含めることの重要性をどのように示しているかに注目してください。一般的には無意味です。実際の問題を見ることができなければ助けが不可能です! – matt

0

データソースは、ビューの読み込み中に設定する必要がありますが、必要な場所であればどこにでもロードできます。

どこviewDidLoad

picker.datasource = self 

の内部では、実際のデータを設定することができます。

picker.dataArray = "example, anything" 

完全にわかりません。もしあなたがこれを探していなかったら私に知らせてください。

関連する問題