Comment utiliser 2 UIPickerView dans un contrôleur de vue?

j'ai 2 Uipickercontrollers dans un des contrôleurs de vue. Je peux obtenir un travail, mais quand j'ajoute une seconde, mon application se bloque. Voici le code que j'utilise pour une vue de picker:

import UIKit

class RegisterJobPosition: UIViewController, UIPickerViewDelegate{

@IBOutlet weak var positionLabel: UILabel!

var position = ["Lifeguard", "Instructor", "Supervisor"]

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

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}    

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

func pickerView(pickerView: UIPickerView!, numberOfRowsInComponent component: Int) -> Int
{
    return position.count
}

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

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    positionLabel.text = position[row]
}
}

maintenant, comment puis-je faire fonctionner un second contrôleur? Dites que mon second PickerView s'appelle location (l'autre est appelée ). J'ai essayé de dupliquer le code dans les méthodes de PickerView pour location mais ça ne fonctionne pas.

J'utilise Swift.

23
demandé sur dom999999 2014-12-25 00:04:57

5 réponses

basé sur les informations que j'ai dans la question, je dirais que vous avez besoin de mettre en place la source de données et les méthodes de délégation pour gérer la capacité de distinguer entre l'instance de picker les appelle.

utilisation de la propriété tag dans le sélecteur de vue est une stratégie.

il devrait y avoir quelques instructions si / else ou switch dans les méthodes qui ont une logique variable selon que c'est l'emplacement ou le capteur de position qui est référencé.

20
répondu andrewcbancroft 2018-07-16 22:40:36

Voici ma solution: - sur le Storyboard, ajoutez 2 PickerView à votre vue - placer l'étiquette 1st pickers comme #1 & #2 pour le 2e picker sous les attributs Inspector - Ctrl + faites glisser chaque picker vers l'icône du contrôleur de vue jaune supérieur et choisissez dataSource.Répéter le même choix de délégué - répétez la procédure ci-dessus pour les autres sélecteur de trop - ajouter pickerview & pickerviewdelegation à votre classe ViewController:

class ViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate {
  • dans votre classe ViewController, créez des tableaux vides pour les vendangeurs:

    var picker1Options = []
    var picker2Options = []
    
  • sur la méthode viewDidLoad (), peuplez les tableaux avec votre contenu:

    picker1Options = ["Option 1","Option 2","Option 3","Option 4","Option 5"]
    picker2Options = ["Item 1","Item 2","Item 3","Item 4","Item 5"]
    
  • implémenter les méthodes delegate & pickerview:

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if (pickerView.tag == 1){
            return picker1Options.count
        }else{
            return picker2Options.count
        }
    }
    
    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
        if (pickerView.tag == 1){
            return "\(picker1Options[row])"
        }else{
            return "\(picker2Options[row])"
        }
    }
    

profitez, amusez-vous et exprimez votre bonheur avec un signe positif.

53
répondu LAOMUSIC ARTS 2017-12-16 19:13:40

j'ai trouvé ça pour travailler.

class SecondViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    @IBOutlet weak var textbox1: UILabel!
    @IBOutlet weak var textbox2: UILabel!

    @IBOutlet weak var dropdown1: UIPickerView!
    @IBOutlet weak var dropdown2: UIPickerView!

    var age = ["10-20", "20-30", "30-40"]
    var Gender = ["Male", "Female"]

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

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        var countrows : Int = age.count
        if pickerView == dropdown2 {
            countrows = self.Gender.count
        }

        return countrows
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView == dropdown1 {
            let titleRow = age[row]
             return titleRow
        } else if pickerView == dropdown2 {
            let titleRow = Gender[row]
            return titleRow
        }

        return ""
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView == dropdown1 {
            self.textbox1.text = self.age[row]
        } else if pickerView == dropdown2 {            
            self.textbox2.text = self.Gender[row]
        }
    }
}
2
répondu Diavel Rider 2017-06-02 03:18:43

mon passé est dans Android mais ma réponse est très OOP. Je suggère de créer différentes classes pour implémenter la source de données et déléguer comme ceci:

class PositionDataSourceDelegate : NSObject, UIPickerViewDelegate, UIPickerViewDataSource {
   var position = ["Lifeguard", "Instructor", "Supervisor"]
   var selectedPosition : String?

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

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
      return position.count
    }

    func pickerView(pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
       return position[row]
    }

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
       selectedPosition = position[row]
    }
}

et puis un autre pour l'Emplacement:

class LocationDataSourceDelegate : NSObject, UIPickerViewDelegate, UIPickerViewDataSource {
   var location = ["Up", "Down", "Everywhere"]
   var selectedLocation : String?

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

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return location.count
    }

    func pickerView(pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
         return location[row]
    }

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        selectedLocation = location[row]
   }
}

puis dans votre Registrerjobposition vous devez créer une instance de chacun:

let positionDSD = PositionDataSourceDelegate()
let locationDSD = LocationDataSourceDelegate()

et de les affecter à la cueilleurs comme ceci:

positionPicker.dataSource = positionDSD
positionPicker.delegate = positionDSD
locationPicker.dataSource = locationDSD
locationPicker.delegate = locationDSD

et vous pouvez accéder à la position sélectionnée et l'emplacement en utilisant:

positionDSD.selectedPosition 
locationDSD.selectedLocation

J'espère que cela vous aidera, vous et les autres, et j'espère aussi des commentaires constructifs sur la raison pour laquelle ce n'est pas "swifty"!--6-->

0
répondu Matei Suica 2016-09-07 00:27:22

je pense que le plus gros problème et différent de Java est que Java permet facilement que les attributs soient passés par le constructeur. par exemple, vous pouvez déclarer classe LocationDataSourceDelegate comme générique et l'appeler genericDataSourceDelegate et faire en sorte que le constructeur accepte et affiche public genericDataSourceDelegate (String data[]) et soit en mesure de créer une classe où il pourrait simplement créer des objets de. Vous l'instantiate juste et passer emplacement le constructeur comme genericDataSourceDelegate (emplacement)

le problème avec votre modèle vous devrez créer autant de classes de délégués dans un programme qui est une contrainte pour votre compilateur.

0
répondu Dula Al-Zakwani 2016-12-13 06:44:33