Comment puis-je get des images à apparaître dans l'interface user PickerView Component dans Swift?

J'essaie d'utiliser des images dans un PickerView Swift. Je ne sais pas comment faire apparaître les images dans le composant. Je sais comment faire cela en utilisant Ssortingngs avec la fonction titleForRow mais je ne sais pas comment faire cela en utilisant des images. Voici mon code jusqu'à présent:

import UIKit class ViewController: UIViewController, UIPickerViewDelegate { @IBOutlet weak var pickerView: UIPickerView! var imageArray: [UIImage] = [UIImage(named: "washington.jpg")!, UIImage(named: "berlin.jpg")!, UIImage(named: "beijing.jpg")!, UIImage(named: "tokyo.jpg")!] 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. } // returns the number of 'columns' to display. func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int{ return 1 } // returns the # of rows in each component.. func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return imageArray.count } }// end of app 

Vous devrez implémenter deux ou trois methods supplémentaires pour le protocole UIPickerViewDelegate. En particulier une méthode de délégué rowHeight et une méthode de délégué viewForRow.

Quelque chose comme:

 // MARK: UIPickerViewDataSource func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { return 1 } func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return 2 } func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { return 60 } // MARK: UIPickerViewDelegate func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView!) -> UIView { var myView = UIView(frame: CGRectMake(0, 0, pickerView.bounds.width - 30, 60)) var myImageView = UIImageView(frame: CGRectMake(0, 0, 50, 50)) var rowSsortingng = Ssortingng() switch row { case 0: rowSsortingng = “Washington” myImageView.image = UIImage(named:"washington.jpg") case 1: rowSsortingng = “Beijing” myImageView.image = UIImage(named:"beijing.jpg") case 2: default: rowSsortingng = "Error: too many rows" myImageView.image = nil } let myLabel = UILabel(frame: CGRectMake(60, 0, pickerView.bounds.width - 90, 60 )) myLabel.font = UIFont(name:some font, size: 18) myLabel.text = rowSsortingng myView.addSubview(myLabel) myView.addSubview(myImageView) return myView } func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { // do something with selected row } 

Notez que la disposition de l'label, etc. est juste pour la démonstration, devrait être modifiée, ou probablement préférable d'utiliser ect Auto Layout.

J'ai eu la même question et fait quelques searchs jusqu'à ce que je l'ai compris. Voici un exemple qui fonctionne bien pour moi. Assurez-vous simplement que vos images dans le dossier Assets sont toutes nommées de la même manière que vos strings de caractères et que vous serez défini!

 @IBOutlet weak var pickerView: UIPickerView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. pickerView.delegate = self } // MARK: UIPickerViewDataSource func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { return 1 } func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return 11 } // MARK: UIPickerViewDelegate func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView { var myImageView = UIImageView() switch row { case 0: myImageView = UIImageView(image: UIImage(named:"airplane")) case 1: myImageView = UIImageView(image: UIImage(named:"beach")) case 2: myImageView = UIImageView(image: UIImage(named:"bike")) case 3: myImageView = UIImageView(image: UIImage(named:"hiking")) case 4: myImageView = UIImageView(image: UIImage(named:"ironman")) case 5: myImageView = UIImageView(image: UIImage(named:"moneybag")) case 6: myImageView = UIImageView(image: UIImage(named:"moneybills")) case 7: myImageView = UIImageView(image: UIImage(named:"ninjaturtle")) case 8: myImageView = UIImageView(image: UIImage(named:"running")) case 9: myImageView = UIImageView(image: UIImage(named:"shoppingcart")) case 10: myImageView = UIImageView(image: UIImage(named:"workingout")) default: myImageView.image = nil return myImageView } return myImageView } func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { // do something with selected row } 

Faire des déclarations de switch peut être fastidieux lorsqu'il s'agit de beaucoup de choses.

Au lieu de cela, utilisez une boucle for comme celle-ci

 for _ in 1..<imageArray.count { myImageView.image = UIImage(named: imageArray[row]) } 

Vous n'avez pas besoin de sous- UIPickerView (et en fait ce n'est probablement pas une vue sage de sous-classr de toute façon). Au lieu de cela, vous devez avoir un object qui implémente le protocole UIPickerViewDelegate . Au sein de cet object, vous implémenteriez la méthode

 optional func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView!) -> UIView 

Cette méthode fournit les vues des composants individuels. Dans cette méthode, vous returnneriez la valeur appropriée de votre tableau d'images.