0

J'ai un viewController qui a un tas d'entrées sur elle. Certains d'entre eux sont du texte normal, mais certains nécessitent une entrée d'un sélecteur. J'ai décidé de déplacer la mise en œuvre de chaque PickerDelegate et PickerDataSource dans un fichier séparé pour garder les choses un peu plus propre. Les données apparaissent mais sur le sélecteur de sélection je ne sais pas comment déclencher l'événement dans mon viewController. Actuellement, il se déclenche uniquement dans la classe PickerDelete.Comment faire pour retourner la valeur sélectionnée dans UIPickerDelegate lors de la création par programme

Certaines informations de mise en page de base est

class MyClass: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { 

let jobTypePickerValues = ["value1", "value2"] 

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

// returns the # of rows in each component.. 
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
    return jobTypePickerValues.count 
} 

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    return jobTypePickerValues[row] 
} 

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
{ 
    //println("I want this in the view controller that set up the picker") 
} 

Dans mon contrôleur de vue qui montre le sélecteur je donne les résultats suivants

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 


    myClassSource = MyClass() 
    pickerView = UIPickerView() 
    pickerView.dataSource = myClassSource 
    pickerView.delegate = myClassSource 

    // set the input view of the job type to be a picker view 
    textInput.inputView = pickerView 
    textInput.text = jobTypePickerValues[0] 
} 
+0

vous pouvez rendre votre délégué MyClass personnalisé qui peut être appelé à votre avis classe contrôleur .. cela va résoudre le problème –

Répondre

0

Vous devez créer un délégué personnalisé et mettre en œuvre dans le ViewController où vous sont en train de créer pickerView.

protocol CustomPickerDelegate { 
    func selectedItem(item: String) 
} 

Maintenant, créer une instance de ce protocole à l'intérieur MyClass et mettre en œuvre à l'intérieur du `ViewController``

class MyClass: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { 

    let jobTypePickerValues = ["value1", "value2"] 
    var delegate: CustomPickerDelegate? 
    .. Other code and methods 

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     delegate?. selectedItem(jobTypePickerValues[row]) 
    } 
} 

maintenant définir le délégué viewDidLoad et mettre en œuvre la méthode du protocole.

class ViewController: UIViewController, CustomPickerDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     myClassSource = MyClass() 
     myClassSource.delegate = self 
     pickerView = UIPickerView() 
     pickerView.dataSource = myClassSource 
     pickerView.delegate = myClassSource 

     // set the input view of the job type to be a picker view 
     textInput.inputView = pickerView 
     textInput.text = jobTypePickerValues[0] 
    } 

     func selectedItem(item: String) { 

      textInput.text = item 
     } 
} 
+0

Merci de cette réponse à ma question, mais je pense que je dois ajouter que, dans la classe MyClass je devais ajoutez le programme d'écoute pour l'événement change, puis appelez la méthode delegate qui ressemblait à ceci: 'func pickerView (sélecteur: UIPickerView, didSelectRow ligne: Int, inComposant du composant: Int) { délégué? selectedItem ("ceci est envoyé au ViewController") } ' – Matt

+0

@Matt Oui j'ai oublié d'ajouter ce code 'delegate ?. selectedItem ("ceci est envoyé au ViewController") ' –

+0

Mais d'autre part il n'y a pas de problème. –